Passing output from dynamic SQL

sim*_*hid 0 sql t-sql sql-server

Currently I have a working version of a dynamic SQL query without any variables except one (@ColumnHeader). And am able to get the desired result being a collection of column names in one line separated by comma.

select @ColumnHeader = COALESCE(@ColumnHeader+',','') + '''' + column_name + '''' 
from databaseName.Information_Schema.Columns
where table_name = 'Dates'
Run Code Online (Sandbox Code Playgroud)

I am trying to add variables for Database_information_schema and TableName.

DECLARE @ColumnHeader varchar(8000) 
DECLARE @Database_Information_SchemaColumns varchar(8000) = 'DatabaseName2.Information_Schema.Columns'
DECLARE @TableName varchar(8000) = 'dates'

DECLARE @sqlQuery as nvarchar(max) = 'Select ' + @ColumnHeader + '= COALESCE(' + @ColumnHeader+ +''','','''')+ ''''''''+column_name+'''''''' from ' + @Database_Information_SchemaColumns + 'where table_name = '''+ @TableName + ''''

Print @sqlQuery

EXEC sp_executesql @sqlQuery;
Run Code Online (Sandbox Code Playgroud)

I am getting Null values and am not sure whats wrong here.

Dal*_*e K 5

下面是一些工作代码。我解释了所需的更改:

  1. 您正在尝试使用动态 SQL 分配参数,因此该参数需要是动态 SQL 字符串的一部分,而不是与其连接。
  2. 要使用动态 SQL 分配参数,您必须将其传入/传出,sp_executesql因为运行动态 SQL 的上下文无法看到声明的参数。
  3. 虽然这不是必需的,但我重命名了内部参数,以便清楚哪个参数属于哪个范围。但是,如果需要,两者都可以使用相同的名称。
  4. 您在where.
  5. 我建议使用varchar(max)并且nvarchar(max)因为没有必要冒着达到 8k 限制的风险。
  6. 使用quotename任何数据库,模式,表或列名,以防止注射。
  7. 使用sysname存储系统名称的数据类型
  8. 将所有系统名称拆分为多个部分以允许使用 quotename
    DECLARE @ColumnHeader varchar(max) 
        , @Database_Information_Database sysname = 'DatabaseName2'
        , @Database_Information_Schema sysname = 'Information_Schema'
        , @Database_Information_Columns sysname = 'Columns'
        , @TableName sysname = 'dates';

    DECLARE @sqlQuery nvarchar(max) = 'select @ColumnHeaderInteral = COALESCE(@ColumnHeaderInteral,'','','''') + '''''''' + column_name + '''''''' from '
        + quotename(@Database_Information_Database) + '.'
        + quotename(@Database_Information_Schema) + '.'
        + quotename(@Database_Information_Columns)
        + ' where quotename(table_name) = ''' + quotename(@TableName) + '''';

    PRINT @sqlQuery;

    EXEC sp_executesql @sqlQuery, N'@ColumnHeaderInteral varchar(max) output', @ColumnHeaderInteral = @ColumnHeader out;

    SELECT @ColumnHeader;
Run Code Online (Sandbox Code Playgroud)

官方文档