2

私はこれを以下のストアドプロシージャに記述し、誤ったステートメントを取得しました。

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
4

3 に答える 3

3

角かっこを自分で連結するのではなく、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 
于 2012-07-21T13:02:02.557 に答える
0

SQL Server では、変数に結果を取得する場合、2 つの選択肢があります。

1 つ目は、カーソルを使用することです。

2 つ目は、動的 SQL を実行することです。

declare @sql varchar(max) = whatever;
declare @cnt int;

declare @cntTable table as (cnt int);

insert into @cntTable
    exec(@sql);

select @cnt = t.cnt
from @cntTable

面倒ですが、どちらか一方が機能します。

于 2012-07-21T12:58:38.373 に答える
0

これを試してみてください。実際のテーブルを照会しませんが、行数を提供します。これは、大きなテーブルがあり、おおよその数が必要な場合に適しています。

ALTER PROCEDURE dbo.[Counter] 
    @TableName VARCHAR(100) 
AS  
begin

declare @objectid int,@counter int
select @objectid = object_id from sys.all_objects where name = @tablename and schema_id=SCHEMA_ID('dbo')
select @counter = sum(rows) from sys.partitions where object_id= @objectid
and index_id in (0,1)
select @counter
end
go
于 2012-07-21T14:00:45.550 に答える