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如何在另一个变量中更改字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中创建字符串列表变量以及如何在另一个查询中使用它?

如何在另一个模块中设置全局变量?

我的变量的值在另一个文件中发生变化

如何在另一个文件中使用该变量? (反应原生)

unity脚本中变量在另一个脚本如何调用

我如何在另一个方法中调用变量