2017-04-14 8 views
0

質問番号パラメータ '@QNumber varchar(5)'(値:Q8、Q9およびQ10) Q8、Q9およびQ10は実際のSQLカラム名です。 @Parameterを使用して、値Q8、Q9、Q10を動的に渡します。カウントは常に同じではありますが、常に同じです。SQLカラムとして@parameterを使用するTSQL

declare @qnumber varchar(5) = 'Q8' 
select total = count(*) 
from table1 
where @qnumber is not null 
+2

にあなたの持つ問題点をお読みください。各質問が*独自の*行を占め、質問番号が* data *のように実際に列に存在するようにテーブルを再設計すると、クエリは簡単に記述できます。 –

+2

**通常のT-SQLクエリでテーブル名または列名を**パラメータ化できません。もしあなたがこれをしなければならない場合、**動的SQL **を使用してその疣贅や欠点をすべて使用することはできません.... –

答えて

0

SQL Serverは、パラメータとして、テーブル名や列名を受け付けません。あなたがsp_executesqlでそれをしようとした場合。あなた*データ*(質問番号)の一部ではなく、あなたの*メタデータ*(ここでは、列名)に埋め込まれているため

すべてについての動的パラメータはhttps://www.mssqltips.com/sqlservertip/2981/using-parameters-for-sql-server-queries-and-stored-procedures/

0

パラメータとして列名を渡すので、通常の変数として使用することはできません。クエリを動的にフォーマットして実行します。

declare @qnumber varchar(5) 
declare @sqlQuery nvarchar(1000) 
set @qnumber='Q8' 
select total=count(*) from table1 where @qnumber is not null 
set @sqlQuery = N'SELECT total=count(*) from table1 where ' + @qnumber + ' is not null' 
exec (@sqlQuery) 
+1

[QUOTENAME](https://docs.microsoft.com/en-us/sql/t- sql/functions/quotename-transact-sql)がSQLインジェクションを防ぐために必要になります。 –

0

これはうまくいくかもしれない:

DECLARE @qnumber varchar(5) = 'Q8' 
DECLARE @sqlQuery NVARCHAR(500) = 
'select total = count(*) from table1 where' + @qnumber +' is not null' 
EXEC (@sqlQuery) 
関連する問題