8

これは簡単な答えかもしれませんが、私はあまりにも長い間それを見つめてきました...

ストアドプロシージャの入力パラメータを変数名として受け取り、そのテーブルのレコードをカウントする次のクエリがあります。動的ステートメント(@toStartStr)の結果を変数(@toStart)に取得したいと思います。

-- @tempTableName = SProc input parameter
DECLARE @toStartStr nvarchar(150);
DECLARE @toStart int;
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName;
EXEC(@toStartStr);

現在、エラーは@toStartを文字列SELECTと連結できないことを示していますが、これが私が望むものの要点です。誰かが私が間違っていることを見ることができますか?または代替案を提案しますか?参考までにSQL2008R2。ありがとう。

4

1 に答える 1

11
DECLARE @sql NVARCHAR(255);

DECLARE @toStart INT;

SET @sql = N'SELECT @toStart = COUNT(ID) FROM ' + QUOTENAME(@tempTableName);

EXEC sp_executesql @sql, N'@toStart INT OUTPUT', @toStart OUTPUT;

PRINT @toStart;

ただし、現在実行中のトランザクションを無視しても問題ない場合 (SQL Server 2005 以降を使用している場合は、質問するときにバージョンを指定してください!)、これを行うためのはるかに簡単で効率的な方法があります。

DECLARE @toStart INT;

SELECT @toStart = SUM(rows) 
  FROM sys.partitions
  WHERE [object_id] = OBJECT_ID(@tempTableName)
  AND index_id IN (0,1);

PRINT @toStart;

完全を期すために、ここに SQL Server 2000 のソリューションを示します。これも特別な権限は必要ありません (接続と public のメンバーのみ)。

DECLARE @toStart INT;

SELECT @toStart = [rows] 
  FROM sysindexes
  WHERE id = OBJECT_ID(@tempTableName)
  AND indid IN (0,1);

PRINT @toStart;

そうは言っても、カウントを使用して次のIDが何であるかを判断している場合、またはそのようなものである場合、行が削除される可能性があり、ID列の値である場合はスキップされる可能性があるため、これに間違った方法でアプローチしていると思いますロールバックのため。

于 2012-06-19T20:04:04.887 に答える