2016-05-07 11 views
-1

これは「私が試したとスカラー変数を宣言する必要がありますエラーMAXカウントを取得し、MINは、動的テーブルからカウントする方法

メッセージ137、レベル15、状態1、行1
を得たものです@MAXCount」

コード:あなたはOUTPUTパラメータとして変数を渡す必要が

DECLARE @TempTable NVARCHAR(MAX) 
DECLARE @MAXCount VARCHAR(10) 
DECLARE @MINCount VARCHAR(10) 
DECLARE @SQLSelect NVARCHAR(MAX) 

SET @TempTable = 'Test_'+CONVERT(VARCHAR(10),@@SPID) 

SET @SQLSelect = 'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) FROM Work_Tables.dbo.'[email protected]+' (NOLOCK)' 

EXEC SP_EXECUTESQL @SQLSelect 

答えて

0

DECLARE @TempTable NVARCHAR(MAX) = 'Test_'+ '1'; -- CONVERT(VARCHAR(10),@@SPID) 
DECLARE @MAXCount VARCHAR(10); 
DECLARE @MINCount VARCHAR(10); 
DECLARE @SQLSelect NVARCHAR(MAX); 


SET @SQLSelect = 'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) FROM dbo.' 
        [email protected]+' (NOLOCK)'; 

EXEC dbo.SP_EXECUTESQL @SQLSelect 
         ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT' 
         ,@MAXCount OUTPUT 
         ,@MINCount OUTPUT; 

SELECT @MAXCount, @MINCount; 

LiveDemo

注:

  1. それはSPIDごとにテーブルを作成するために、貧しい人々のデザインのように見えます。関連:SELECT * FROM sales + @yymm
  2. 表名がSYSNAMEデータ型を持っている、あなたは、SQLクエリを連結すると、エラーが発生しやすい可能性があり、あなたがREPLACE
  3. NOLOCK読み取りコミットされていないにつながる可能性がある使用することができ
  4. SQLインジェクションに対する追加の保護のためにQUOTENAMEを追加することができなければなりません。

ような何か:

DECLARE @MAXCount VARCHAR(10) 
     ,@MINCount VARCHAR(10); 

DECLARE @SQLSelect NVARCHAR(MAX) = 
N'SELECT @MAXCount = MAX(RowID), @MINCount = MIN(RowID) 
    FROM <table_name> WITH (NOLOCK)'; 

DECLARE @TempTable SYSNAME = QUOTENAME('Test_'+ '1'); -- CONVERT(VARCHAR(10),@@SPID) 


SET @SQLSelect = REPLACE(@SQLSelect, '<table_name>', @TempTable); 

EXEC dbo.SP_EXECUTESQL @SQLSelect 
         ,N'@MAXCount VARCHAR(10) OUTPUT, @MinCount VARCHAR(10) OUTPUT' 
         ,@MAXCount OUTPUT 
         ,@MINCount OUTPUT; 

SELECT @MAXCount, @MINCount; 
+0

ありがとうございました私のために働いている、まだ_SYSNAME_と_QUOTENAME_上のいくつかの研究を行う必要があります。 – Joby

関連する問題