初始化要在SQL Server中的存储过程中使用的表名

时间:2012-11-26 11:05:51

标签: sql-server-2008

我正在尝试创建一个存储过程来在存储过程中实现以下功能

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'

请帮助解释此代码。

2 个答案:

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