动态SQL未返回列名称的完整列表

时间:2016-04-05 06:22:43

标签: tsql dynamic

我有两个独立的环境,它们在相同的数据库上执行相同的TSQL代码,但第二个环境产生错误的响应。该脚本使用动态SQL从特定表(问题)中获取列名列表,然后生成CSV字符串。

环境1生产:

Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13,Q14,Q15,Q16,Q17,Q18,Q19,

环境2产生:

Q9,

DECLARE @Questions NVARCHAR(2000) = '',                                             
        @SQLTemplateQuery NVARCHAR(2000) = '',
        @Exclude NVARCHAR(2000) ='',
        @ExecSQL NVARCHAR(2000)='';                 

 --This is just a template that gets executed on more than one table in the DB
 SET @SQLTemplateQuery = 'SELECT @Cols = COALESCE( @Cols , '''' ) + c.Name + '','' FROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_id WHERE t.Name = @Table AND c.Name NOT IN ( {0} ) ORDER BY c.column_id;';

 SET @Exclude = '''Id'''; -- Specify columns to exclude.
 SET @ExecSQL = REPLACE( @SQLTemplateQuery, '{0}', @Exclude ); --Replace the marker with columns to exclude.
 SET @ExecSQL = REPLACE( @ExecSQL, '@Cols', '@Questions' ); --Replace the template variable with actual one used    
 EXEC sp_executesql @ExecSQL, N'@Questions NVARCHAR(2000) OUT, @Table NVARCHAR(50)', @Questions OUT, N'Questions';
 SELECT @Questions

CREATE TABLE [dbo].[Questions]
(
    [Id] [uniqueidentifier] NOT NULL,
    [Q1] [varchar](128) NULL,
    [Q2] [varchar](128) NULL,
    [Q3] [varchar](128) NULL,
    [Q4] [varchar](128) NULL,
    [Q5] [varchar](128) NULL,
    [Q6] [varchar](128) NULL,
    [Q7] [varchar](128) NULL,
    [Q8] [varchar](128) NULL,
    [Q9] [varchar](128) NULL,
    [Q10] [varchar](128) NULL,
    [Q11] [varchar](128) NULL,
    [Q12] [varchar](128) NULL,
    [Q13] [varchar](128) NULL,
    [Q14] [varchar](128) NULL,
    [Q15] [varchar](128) NULL,
    [Q16] [varchar](128) NULL,
    [Q17] [varchar](128) NULL,
    [Q18] [varchar](128) NULL,
    [Q19] [varchar](128) NULL
) 

环境2虽然在SQL2014上运行,其中环境1是SQL2012 我正在处理的是否有一些已弃用的功能? 我的代码中只有一个错误吗? 这里是否有可能以不同方式处理动态SQL的服务器设置?

有趣的是,相同的代码在其他4个表中运行,并且它们都产生相同的结果,只返回1列,但它没有通过错误。 (前1名?但我不编码)

提前致谢

0 个答案:

没有答案