我有两个独立的环境,它们在相同的数据库上执行相同的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名?但我不编码)
提前致谢