我正在尝试创建一个存储过程来在存储过程中实现以下功能
DECLARE @TBLNAME VARCHAR(128)
SET @TBLNAME = SELECT PAR_VALUE FROM DBO.PARAMETERS WHERE PAR_NAME='SALES_ORDERS_TABLE';
PAR_VALUE
表中的PARAMETERS
列包含Sales Order
表的表名。
我现在想在存储过程中使用此表名,并计算此表中的行数。
DECLARE @SQL NVARCHAR(4000)
@ SQL = SELECT COUNT(*) FROM '[@TBLNAME]'
但是,当我尝试运行它时,会出现多个错误。
你可以指导一下如何做到这一点来帮助我吗?
我刚才尝试了这段代码:
CREATE PROCEDURE JCOUNT_SO
AS
DECLARE @TBLNAME NVARCHAR(512)
SELECT @TBLNAME=(SELECT PAR_VALUE FROM DBO.PARAMETERS WHERE PAR_NAME='SALES_ORDERS_TABLE')
DECLARE @SQL NVARCHAR(4000)
SELECT @SQL='SELECT COUNT(*) AS #_OF_RECORDS INTO SO_COUNT
FROM' '+QUOTENAME(@TBLNAME)''
EXEC SP_EXECUTESQL @SQL;
错误消息:无效的对象名称:'TEST.DBO.SO_MASTER'
请帮助解释此代码。
答案 0 :(得分:1)
请阅读sp_executesql的定义以供参考。下面的过程将值作为动态查询的输出参数返回,而不是插入表中。您可以根据自己的要求操作查询。
CREATE PROCEDURE JCOUNT_SO
AS
DECLARE @TBLNAME nvarchar(512)
--Obtain table name. Top 1 is used to pick first record rather than last record in case query returns more than one record.
SELECT TOP 1 @TBLNAME = PAR_VALUE FROM DBO.PARAMETERS WHERE PAR_NAME='SALES_ORDERS_TABLE'
DECLARE @SQL NVARCHAR(4000)
DECLARE @Count int
SET @SQL ='SELECT @Count = COUNT(*) FROM ' + @TBLNAME
--Define parameters to be passed i.e. @Count is being passed as output parameter
EXEC SP_EXECUTESQL @SQL, N'@Count int OUTPUT', @Count output
select @Count
end
来自MSDN的说明
查询即@SQL
可以包含与变量名称具有相同形式的参数,@SQ
中包含的每个参数都必须在@params
参数定义列表和parameter values
中都有相应的条目{1}}列表
答案 1 :(得分:0)
我可以说是1点......它应该是SET @SQL = SELECT ...
还有一件事是你可以尝试将结果转换为NVARCHAR
。
使用SELECT Convert(NVARCHAR(4000),Count(*)) FROM ...