2017-07-07 6 views
1

ダイナミックSQLの結果を@Countという変数に出力したいが、これを達成するために構文やコードがどのようなものであるべきかは不明である。 変数へのクエリの動的SQL出力

declare @tab nvarchar(255) = 'Person.person' 

declare @Count int 
declare @SQL nvarchar(max) = 'select count(*) from '+ @tab 


exec(@SQl) 


select @Count 

あなたはあなたのカウント数()クエリを実行するために sp_executesqlを利用することができ、あなたに

+0

あなたはこのために、動的SQLを使用したくないのはなぜ... – scsimon

+0

私は思いますが絶対に避けられない限り、動的SQLの使用は避けてください。あなたはオートコンプリートもなくなり、全体としてエラーが発生しやすくなります。 – user2366842

+0

また、SQLインジェクションの問題もあります。あなたが無視してはいけない非常に大きな問題です。 – RBarryYoung

答えて

1

に感謝し、出力すること@Count:

コードは次のように見えます。

-- Set the table to count from 
declare @tab nvarchar(255) = 'Person.person' 

-- Assign the SQL query 
declare @SQL nvarchar(255) = N'SELECT count(*) FROM ' + @tab 

-- Pepare for sp_executesql 
declare @Count int 
declare @Params nvarchar(100) = N'@Count int output' 

-- Set the count to @Count 
exec sp_executesql @SQL, @Params, @[email protected] output 

-- Output @Count 
select @Count 

最後の一つです:あなたは、Personテーブルから人の列を参照しようとしている可能性がありますようにPerson.personに見える

はこれを試してみてください。しかし、上記のクエリは、あなたの質問で達成しようとしているように見えるもののリテラル表現です。

+1

Hmmm。実際にこれを試しましたか? –

+1

動的SQLコンテキストは、外部コンテキストの変数を参照または変更できません。 – RBarryYoung

+0

素晴らしいポイント;変数の範囲について考えていた私の心を越えていない。 @Jesseはちょうど私がここで言及しようとしていた答えを掲示しました。 sp_executeSqlをすぐに使用するようにこれを修正します。 – RToyo

1

以下の質問は、あなたがここで求めているものとほとんど同じです。

sp_executeSql with output parameter

DECLARE @retval int 
DECLARE @sSQL nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

DECLARE @tablename nvarchar(50) 
SELECT @tablename = N'products' 

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename; 
SET @ParmDefinition = N'@retvalOUT int OUTPUT'; 

EXEC sp_executesql @sSQL, @ParmDefinition, @[email protected] OUTPUT; 

SELECT @retval; 
+0

ありがとう、ジェシー、働いた – abs786123

3

ここでも安全にSQLインジェクションisuuesに対処し、それを行うための別の方法です:

/* Counts the number of rows from any non-system Table, *SAFELY* */ 

-- The table name passed 
DECLARE @PassedTableName as NVarchar(255) = 'Person.Person'; 

-- Make sure this isn't a SQL Injection attempt 
DECLARE @ActualTableName AS NVarchar(255) 

SELECT @ActualTableName = TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = PARSENAME(@PassedTableName,1) 
    AND TABLE_SCHEMA = PARSENAME(@PassedTableName,2) 

-- make a temp table to hold the results 
CREATE TABLE #tmp(cnt INT); 

-- create the dynamic SQL 
DECLARE @sql AS NVARCHAR(MAX) 
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' 

-- execute it and store the output into the temp table 
INSERT INTO #tmp(cnt) 
EXEC(@SQL); 

-- Now, finally, we can get it into a local variable 
DECLARE @result AS INT; 
SELECT @result = cnt FROM #tmp; 
+0

私はこれをテストすることができません、あなたは別のテーブルにexecの結果を挿入することができますか?私はそれをSybase上でテストしましたが(現時点ではSQLServerに最も近い)、動的なSQL結果をテーブルに挿入することはできません。 – RToyo

+0

@RobbieToyotaはい、私は確信しています。私はそれをずっとやっていますし、投稿する前にコードをテストしました。 – RBarryYoung

+1

ありがとう、私は今日何か新しいことを学んだ。 :) – RToyo