How execute sql within a cursor

KevinH2 21 Reputation points
2022-06-22T20:06:31.083+00:00

I can't get the results of this cursor to execute

DECLARE @myVar varchar(MAX)
DECLARE @alenzi varchar(MAX)
DECLARE myCursor CURSOR FOR
SELECT name from master.sys.databases

OPEN myCursor
FETCH NEXT FROM myCursor INTO @myVar

WHILE @@Fetch _STATUS = 0
BEGIN
SET @alenzi = 'SELECT name FROM '+@myVar+'.sys.assemblies'
EXEC sp_executesql @alenzi
FETCH NEXT FROM myCursor INTO @myVar
END

CLOSE myCursor
DEALLOCATE myCursor

Transact-SQL
Transact-SQL
A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.
4,689 questions
0 comments No comments
{count} votes

Accepted answer
  1. Dan Guzman 9,261 Reputation points
    2022-06-22T20:31:57.45+00:00

    DECLARE @alenzi varchar(MAX)

    Specify nvarchar(MAX) for the sp_executesql parameter type:

    DECLARE @sql nvarchar(MAX);  
    

2 additional answers

Sort by: Most helpful
  1. Tom Phillips 17,741 Reputation points
    2022-06-23T12:55:01.457+00:00

    In your case I prefer not to use a cursor and just create a string with all results

    DECLARE @sql nvarchar(MAX)  
      
    SET @sql = (  
    SELECT   
    	STRING_AGG(CONCAT('SELECT ''',name,''' as [DBName], [name] as [AssemblyName] FROM [',name,'].sys.assemblies') , CHAR(10)+'UNION ALL'+CHAR(10)) WITHIN GROUP (ORDER BY [name])  
    from master.sys.databases  
    );  
      
    EXEC sp_executesql @sql  
    
    1 person found this answer helpful.

  2. Naomi Nosonovsky 8,146 Reputation points
    2022-06-22T20:28:27.57+00:00

    Try changing this line to
    SET @alenzi = 'SELECT name FROM '+QUOTENAME(@myVar) +'.sys.assemblies' ;

    also you may probably want to exclude system databases ?

    Are you getting an error with your code?


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.