DECLARE
@id int = NULL, @district int = 12, @zone int = 48,
@str nvarchar(max) = NULL, @sanctioned int = 0
CREATE TABLE #runningTable
(
postid int NULL,
postname varchar(50) NULL,
sanction int NULL DEFAULT 0,
surplus int NULL DEFAULT 0,
inposition int NULL DEFAULT 0,
aar int NULL DEFAULT 0,
vacant int NULL DEFAULT 0
)
SET @str = 'select @sanctioned = (SUM('+@value+')) FROM staff_strength_details a
INNER JOIN school_master b ON b.udisecode = a.udisecode
WHERE CONVERT(varchar, b.district_id) = ''' + CONVERT(varchar, @district) + ''' AND
CONVERT(varchar, b.zone_id) = ''' + CONVERT(varchar, @zone) + '''
@sanctioned int output
'
EXEC sp_executesql @str, @sanctioned = @sanctioned OUTPUT
UPDATE #runningTable
SET sanction = @sanctioned
WHERE postid = @id
SELECT * FROM #runningTable
DROP TABLE #runningTable
在上面的查询中,我声明了一个@sanctioned
变量,需要获取此变量中动态列的总和。然后,需要在动态表#runningTable
中更新变量。但是在执行上述查询时,我得到一个错误
程序需要类型为'ntext / nchar / nvarchar'的参数'@params'
因此,我已将@str
声明为nvarchar
,但仍然遇到相同的错误。
如何获取声明的变量@sanctioned
的值?
答案 0 :(得分:2)
这里是有关如何使用动态sql的小示例。它接受一个变量作为动态字符串的输入,并向变量@ l_out1
输出单个值 sum(status)您可以修改此示例以适合您的要求。在您的示例中,我发现您有一条语句sum(@value),但是未定义@value。
declare @str nvarchar(4000)
declare @l_out1 int
declare @l_status1 int =1
set @str='select @l_out=sum(status) '
+ 'from master..spt_values '
+ 'where status=@l_status '
exec sp_executesql @str
,N'@l_status INT,@l_out INT OUTPUT'
,@l_status=@l_status1
,@l_out=@l_out1 output
select @l_out1 as 'col1'
工作示例
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=4ebab535a4970f478ce22547e5dd8150