如何从动态查询中获取变量的值

时间:2020-08-08 05:58:02

标签: sql-server tsql dynamic-sql

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的值?

1 个答案:

答案 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