我正在使用东西来加入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。
请指导是否有任何解决方法,我不能单独转换每列,因为列可能会更改。
答案 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