2

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

DECLARE @TBLNAME VARCHAR(128)

SET @TBLNAME = SELECT PAR_VALUE FROM DBO.PARAMETERS WHERE PAR_NAME='SALES_ORDERS_TABLE';

表中的PAR_VALUEPARAMETERS包含表的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'

请对此代码提供帮助。

4

2 回答 2

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 的笔记

查询ie@SQL可以包含与变量名形式相同的参数,并且L中包含的每个参数必须在参数定义列表和列表@SQ中都有对应的条目@paramsparameter values

于 2012-11-26T14:05:14.027 回答
0

我可以说的 1 点是......它应该是SET @SQL = SELECT ... ,还有一件事是你可以尝试将结果转换为NVARCHAR.

采用SELECT Convert(NVARCHAR(4000),Count(*)) FROM ...

于 2012-11-26T11:12:07.187 回答