加入select时,无法在STUFF中将int转换为varchar

时间:2015-11-19 11:01:33

标签: tsql sql-server-2008-r2

我正在使用东西来加入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。

请指导是否有任何解决方法,我不能单独转换每列,因为列可能会更改。

1 个答案:

答案 0 :(得分:0)

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

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

 SET @columnsCast = 'CAST(' + REPLACE(@columns, ',', ' AS VARCHAR(MAX)) + '', '' CAST( ') + ' AS VARCHAR(MAX))'

这应该使@columnsCast变量看起来像这样:

CAST(ID AS VARCHAR(MAX)) + ', ' + CAST(CaseID AS VARCHAR(MAX)) + ', ' + CAST(DocumentType AS VARCHAR(MAX)) + ', ' ...

然后只需执行如下动态SQL语句:

SET @sql = N'DECLARE @newvalues AS VARCHAR(MAX) = '''';
             SELECT @newvalues = @newvalues + ' + @columnsCast + ' FROM #MYINSERTED'

然后,当您执行此表达式时,请确保输出@newvalues,如下所示:

DECLARE @newvals AS VARCHAR(MAX)
EXECUTE sp_executesql @sql, N'@newvalues VARCHAR(MAX) OUTPUT', @newvalues=@newvals OUTPUT
SELECT @newvals