任何人都可以建议我是否可以在下面描述的场景中动态地声明和赋值给变量?
我已经编写了一个存储过程(sproc),用于计算组织的子组中成员的百分比。我知道有7个子组。我将百分比计算的结果存储在7个变量中,后面我将其用于sproc中。每个变量都根据子组名称命名。
当然,这意味着如果子组的名称或数量发生变化,我必须重写部分sproc。
我相信动态SQL可以用于允许sproc适应子组中的更改,但我不确定如何为此方案设置动态SQL。任何人都可以提供一个例子或指导?
任何人都可以建议我是否可以在下面描述的场景中动态地声明和赋值给变量?
我已经编写了一个存储过程(sproc),用于计算组织的子组中成员的百分比。我知道有7个子组。我将百分比计算的结果存储在7个变量中,后面我将其用于sproc中。每个变量都根据子组名称命名。
当然,这意味着如果子组的名称或数量发生变化,我必须重写部分sproc。
我相信动态SQL可以用于允许sproc适应子组中的更改,但我不确定如何为此方案设置动态SQL。任何人都可以提供一个例子或指导?
什么你提议去对SQL粮食服务器。您对以后需要重写的担心可以说明这一点...所以您正处于正确的轨道上。
一般而言,您希望将结果转化为某种面向集合的事物......表格式...其中一列具有子组名称,另一列具有计算值。
您可能会发现table-valued functions更适合您的问题......但很难说......我们并不深究这个问题的细节。
动态SQL几乎总是最后的手段。这似乎很有趣,但有各种各样的问题......其中最重要的是以程序安全和一致的方式处理结果。
你可以按照这个简单的查询就看你如何能做到这一点
declare @sql nvarchar(max) = ''
declare @outerX int = 0 -- this is your variable you want to set it from dynamic SQL
declare @i int = 0 -- for loop
while @i <= 6
begin
set @sql = 'select @x = ' + CAST(@i as varchar)
exec sp_executesql @sql, N'@x int OUTPUT', @x = @outerX output
set @i = @i + 1
print @outerX
end
输出将被
0
1
2
3
4
5
6
动态SQL通常不是sql问题的解决方案。就像游标一样,它有它的位置,但很容易搞砸,难以维护,容易受到注入攻击。考虑使用一个临时表(或表变量),每个“变量”有一行,而不是使用标准的sql变量。 – StingyJack