2012-06-19 18 views
7

これは簡単な答えかもしれませんが、私が長すぎるためにそれを見つめてきた...シンプルダイナミックTSQLクエリ構文

私は、変数名とカウントとしてストアドプロシージャの入力パラメータを受け取り、次のクエリを持っていますそのテーブルのレコード私は動的ステートメント(@ 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の文字列と連結することができないことを示唆しているが、これは私が何をしたいの要旨です。誰かが私が間違っているのを見ることができますか?あるいは代替案を提案しますか? FYI SQL 2008 R2。ありがとう。ときのバージョンを指定してください - あなたは中のトランザクション(およびSQL Server 2005またはより良いを使用している電流を無視して大丈夫なら

答えて

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; 

ただし、これを行うには非常に簡単に、より効率的な方法があります質問する!)。

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のソリューション、次のとおりです。

DECLARE @toStart INT; 

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

PRINT @toStart; 

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

+0

あなたは** sa **ユーザーであるとは限りません。私はこのクエリを実行するには管理者権限が必要だと思います。右? – Pankaj

+0

いいえ、私は管理者権限を持っていないシステムでテストしましたが、正常に動作します。 – JNK

+0

@ Kanaviいいえ、sys.partitionsの表示に管理者権限は必要ありません。コードを削除するように言われる前にそれを試しましたか? –