sql - 用于计算动态表项目的 MS SQL 存储过程

标签 sql sql-server sql-server-2008 stored-procedures stored-functions

我在下面写了这个存储过程并得到了错误的陈述。

ALTER PROCEDURE dbo.[Counter]
        @TableName VARCHAR(100)
    AS 
        BEGIN
            DECLARE @Counter INT
            DECLARE @SQLQ VARCHAR(200)
            SET NOCOUNT ON;

        --SET @TableName = 'Member';
        SET @SQLQ = 'SELECT COUNT(*) FROM dbo.[' + @TableName + ']';
        --Preparing the above sql syntax into a new statement(get_counter).

            --Getting an error here I had googled the prepare statement but don't know why facing this error.
        PREPARE get_counter FROM @SQLQ;
    @Counter = EXEC get_counter; -- here @resutl gets the value of the count.@TableName
        DEALLOCATE PREPARE get_counter; -- removing the statement from the memory.


    END

然后我又写了一个:

ALTER PROCEDURE dbo.[Counter]
    @TableName VARCHAR(100)
AS 
    BEGIN
        DECLARE @Counter INT
        DECLARE @SQLQ VARCHAR(200)
        SET NOCOUNT ON;

        --SET @TableName = 'Member';
        SET @SQLQ = 'SELECT COUNT(*) FROM dbo.[' + @TableName + ']';
        --Preparing the above sql syntax into a new statement(get_counter).


    Execute @SQLQ; -- here @resutl gets the value of the count.@TableName

        --DEALLOCATE PREPARE get_counter; -- removing the statement from the memory.
        Return @Counter;

    END

它运行良好,但我无法在计数器中获得结果,请任何人帮助我(我知道我没有为计数器分配任何值,但如果我这样做,我会收到错误)。

在你回答马丁之后,我已经用你的代码替换了我的代码,现在是:

ALTER PROCEDURE dbo.[Counter] @SchemaName SYSNAME = 'dbo' , @TableName  SYSNAME

AS
  BEGIN
      SET NOCOUNT ON;

      DECLARE @SQLQ NVARCHAR(1000)
      DECLARE @Counter INT;

      SET @SQLQ = 'SELECT @Counter = COUNT(*) FROM ' + 
       Quotename(@SchemaName) + '.' + Quotename(@TableName);

      EXEC sp_executesql
        @SQLQ ,
        N'@Counter INT OUTPUT',
        @Counter = @Counter OUTPUT

      Return   SELECT @Counter
  END 

现在我已经取回它了。

  ALTER PROCEDURE dbo.[CreateBusinessCode]
    @MemberID                               bigint,
    @len                                        int,
    @RewardAccountID                bigint,
    @ConnectionStatusID         tinyint,
    @Assign                                 smalldatetime

AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @counter INT

    EXEC @counter = dbo.Counter 'dbo','member';

    Select @counter;


    END

最佳答案

您应该使用SYSNAME作为对象标识符和Quotename,而不是自己连接方括号。

ALTER PROCEDURE dbo.[Counter] @TableName  SYSNAME,
                              @SchemaName SYSNAME = 'dbo'
AS
  BEGIN
      SET NOCOUNT ON;

      DECLARE @SQLQ NVARCHAR(1000)
      DECLARE @Counter INT;

      SET @SQLQ = 'SELECT @Counter = COUNT(*) FROM ' + 
       Quotename(@SchemaName) + '.' + Quotename(@TableName);

      EXEC sp_executesql
        @SQLQ ,
        N'@Counter INT OUTPUT',
        @Counter = @Counter OUTPUT

         SELECT @Counter
  END 

关于sql - 用于计算动态表项目的 MS SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592327/

相关文章:

sql - 运行 SQL 查询时出现 "ORA-00913: too many values"错误

sql - LENGTH 命令的奇怪行为 - ORACLE

php - mysql:复制表中的某些行,更改重复行中的信息

sql-server - SQL Server 负载分布

c# - 使用 Entity Framework 保存具有外键约束的数据

sql - 使用 XML 数据类型读取存储在 SQL Server 2008 R2 中的 XML 文档

sql - Sql Server 和 Mysql Server 之间的同步

sql - Microsoft.SqlServer.BatchParser 问题

sql-server - 与 SQL Server RollUP 求和 - 但只是最后的总结?

sql - 在查询末尾插入 ROW,其中包含 SUM 列的总计