Tsql 加入select时无法将int强制转换为STUFF中的varchar

Tsql 加入select时无法将int强制转换为STUFF中的varchar,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我正在使用stuff加入select的结果。我需要连接的列不是常量,可以更改。所以我把它们放在一个变量中,准备一个动态查询 SET @sql = N'Select @newvalues = STUFF( ( Select '','' + ' + @columns + ' FROM #MYINSERTED FOR XML PATH(''''),TYPE) .value(''.'',''VARCHAR(MAX)''),1,2,'''')' 此查询转

我正在使用stuff加入select的结果。我需要连接的列不是常量,可以更改。所以我把它们放在一个变量中,准备一个动态查询

SET @sql =  N'Select @newvalues = STUFF( ( Select '','' +  ' + @columns + ' FROM #MYINSERTED FOR XML PATH(''''),TYPE)
                      .value(''.'',''VARCHAR(MAX)''),1,2,'''')' 
此查询转换为如下所示:

Select @newvalues = STUFF( 
                    ( Select ',' +  ID, CaseID, DocumentType, FileName, FileExtension, FilePath, InsertDate, InsertedBy, ModifiedDate, ModifiedBy, OriginalFileName 
                    FROM #MYINSERTED FOR XML PATH(''),TYPE)
                      .value(''.'',''VARCHAR(MAX)''),1,2,'')
但是第一列ID是一个整数,我得到以下错误

将varchar值“”转换为int数据类型时,转换失败


请说明是否有任何解决方法,我无法单独转换每一列,因为列可能会更改。

没有理由使用STUFF、FOR XML PATH等将所有列的输出合并为单个字符串。只要确保在构造动态SQL时显式转换所有列即可

如何构造
@columns
变量?我假设它包含“ID,CaseID,DocumentType,…”之类的内容。您必须构造一个执行显式转换的类似变量,或者像下面这样转换
@columns
变量:

 SET @columnsCast = 'CAST(' + REPLACE(@columns, ',', ' AS VARCHAR(MAX)) + '', '' CAST( ') + ' AS VARCHAR(MAX))'
CAST(ID AS VARCHAR(MAX)) + ', ' + CAST(CaseID AS VARCHAR(MAX)) + ', ' + CAST(DocumentType AS VARCHAR(MAX)) + ', ' ...
SET @sql = N'DECLARE @newvalues AS VARCHAR(MAX) = '''';
             SELECT @newvalues = @newvalues + ' + @columnsCast + ' FROM #MYINSERTED'
DECLARE @newvals AS VARCHAR(MAX)
EXECUTE sp_executesql @sql, N'@newvalues VARCHAR(MAX) OUTPUT', @newvalues=@newvals OUTPUT
SELECT @newvals
这将使
@columnsCast
变量如下所示:

 SET @columnsCast = 'CAST(' + REPLACE(@columns, ',', ' AS VARCHAR(MAX)) + '', '' CAST( ') + ' AS VARCHAR(MAX))'
CAST(ID AS VARCHAR(MAX)) + ', ' + CAST(CaseID AS VARCHAR(MAX)) + ', ' + CAST(DocumentType AS VARCHAR(MAX)) + ', ' ...
SET @sql = N'DECLARE @newvalues AS VARCHAR(MAX) = '''';
             SELECT @newvalues = @newvalues + ' + @columnsCast + ' FROM #MYINSERTED'
DECLARE @newvals AS VARCHAR(MAX)
EXECUTE sp_executesql @sql, N'@newvalues VARCHAR(MAX) OUTPUT', @newvalues=@newvals OUTPUT
SELECT @newvals
然后只需执行如下动态SQL语句:

 SET @columnsCast = 'CAST(' + REPLACE(@columns, ',', ' AS VARCHAR(MAX)) + '', '' CAST( ') + ' AS VARCHAR(MAX))'
CAST(ID AS VARCHAR(MAX)) + ', ' + CAST(CaseID AS VARCHAR(MAX)) + ', ' + CAST(DocumentType AS VARCHAR(MAX)) + ', ' ...
SET @sql = N'DECLARE @newvalues AS VARCHAR(MAX) = '''';
             SELECT @newvalues = @newvalues + ' + @columnsCast + ' FROM #MYINSERTED'
DECLARE @newvals AS VARCHAR(MAX)
EXECUTE sp_executesql @sql, N'@newvalues VARCHAR(MAX) OUTPUT', @newvalues=@newvals OUTPUT
SELECT @newvals
然后,在执行此表达式时,请确保按如下方式输出
@newvalues

 SET @columnsCast = 'CAST(' + REPLACE(@columns, ',', ' AS VARCHAR(MAX)) + '', '' CAST( ') + ' AS VARCHAR(MAX))'
CAST(ID AS VARCHAR(MAX)) + ', ' + CAST(CaseID AS VARCHAR(MAX)) + ', ' + CAST(DocumentType AS VARCHAR(MAX)) + ', ' ...
SET @sql = N'DECLARE @newvalues AS VARCHAR(MAX) = '''';
             SELECT @newvalues = @newvalues + ' + @columnsCast + ' FROM #MYINSERTED'
DECLARE @newvals AS VARCHAR(MAX)
EXECUTE sp_executesql @sql, N'@newvalues VARCHAR(MAX) OUTPUT', @newvalues=@newvals OUTPUT
SELECT @newvals

我得到一个错误:“=”附近的语法不正确。此外,变量@columns不是一列,而是一个逗号分隔的列字符串。。那么,如果你描述了你想要达到的目标,那么比较和演员的工作是否有效呢。例如,@newvalues的预期输出是什么?我认为对于XML路径(“”)等,有一种比使用STUFF更简单的方法来做您想要做的事情。我想将select语句返回的单行列合并成逗号分隔的字符串(@newvalues)。。但这里唯一的问题是每次的列数都不一样。请看我更新的答案。@Dan谢谢Dan,它成功了。。只要我好好想一想,事情就很简单了。。不过只是一个小的修正。。感激它——