SQL如何在另一个变量中更改字符串变量
Posted
技术标签:
【中文标题】SQL如何在另一个变量中更改字符串变量【英文标题】:SQL How to change string variable inside another variable 【发布时间】:2016-05-18 13:47:33 【问题描述】:是否可以通过执行另一个变量来改变一个变量?
我现在的代码:
DECLARE
@CHOSENID VARCHAR(MAX),
@sql VARCHAR(MAX),
@COLUMNS VARCHAR(MAX)
SET @CHOSENID = '1032, 1132, 332, 1021'
SET @sql = ' select @COLUMNS = COALESCE(@COLUMNS + '' '', '''') + n.PRODUCT + '' BIGINT NOT NULL DEFAULT -1,''
from MYTABLE n where ID IN ('+@CHOSENID+') and TYPE=''X''
SET @COLUMNS = CONCAT(@COLUMNS, ''TIME DATETIME NOT NULL DEFAULT GETDATE() '')'
PRINT @sql
EXEC (@sql)
PRINT @COLUMNS
结果错误:
必须声明标量变量“@COLUMNS”。
当我尝试在@sql
中声明@COLUMNS
时,可以执行查询,但PRINT @COLUMNS
不返回任何内容。
MYTABLE
中的ID
是bigint 而@CHOSENID
是varchar,所以我不能简单地执行这个而不添加@sql
【问题讨论】:
【参考方案1】:我认为您正在尝试返回一个值。您应该使用带有输出参数的sp_executesql
。像这样的:
DECLARE @CHOSENID VARCHAR(MAX), @sql NVARCHAR(MAX), @COLUMNS VARCHAR(MAX);
SET @CHOSENID = '1032, 1132, 332, 1021';
SET @sql = N'
declare @columns varchar(max);
select @Columns = COALESCE(@COLUMNS + '' '', '''') + n.PRODUCT + '' BIGINT NOT NULL DEFAULT -1,''
from MYTABLE n
where ID IN (' + @CHOSENID+ ') and TYPE = ''X''
';
exec sp_executesql @sql, 'N'@Columns varchar(max) output', @Columns = @Columns output;
print @Columns;
这不会在最后的set
中进行最后的串联。它旨在展示如何使用sp_executesql
。
【讨论】:
【参考方案2】:如果我正确理解您的尝试,则根本不需要动态 SQL:
试试这个
DECLARE @CHOSENID VARCHAR(MAX)='1032, 1132, 332, 1021';
WITH ChosenIDs AS
(
SELECT A.B.value('.','int') AS ChosenID
FROM (SELECT CAST('<x>' + REPLACE(@CHOSENID,', ','</x><x>') + '</x>' AS XML) AS Splitted) AS tbl
CROSS APPLY Splitted.nodes('/x') AS A(B)
)
SELECT STUFF(
(
SELECT ',' + n.PRODUCT + ' BIGINT NOT NULL DEFAULT -1'
FROM MYTABLE n
WHERE ID IN (SELECT ChosenID FROM ChosenIDs)
AND [TYPE]='X'
FOR XML PATH('')
),1,1,'')
简短说明:
CTE 会先将您的@CHOSENID
转入
'<x>1032</x><x>1132</x><x>332</x><x>1021</x>'
通过 XML 方法 .nodes()
将其拆分并读取为 int 值。因此,CTE 作为带有您的数字的派生表返回。
您最好使用 FOR XML PATH()
的技巧来连接值,而不是 SELECT @var=@var + ISNULL(Something,'') FROM...
。
由于我不知道您到底要达到什么目标,所以这在夜间盲目飞行...希望对您有所帮助...
【讨论】:
嗨@Kelk,如果这对您来说很容易(并且数据量足以注意到差异),我会请您将动态 SQL 方法与我的 ad-hoc 在性能方面的方法。我现在没有时间自己设置测试场景......谢谢 不幸的是数据量太小 - 在成百上千条记录中,时间和已用内存几乎没有差异。 @Kelk Thx 进行测试!以上是关于SQL如何在另一个变量中更改字符串变量的主要内容,如果未能解决你的问题,请参考以下文章