0

5 つの列を持つテーブルがあるとします。完全な選択ステートメントは次のようになります。

Select col1, col2, col3, col4, col5 
from tbl

しかし、このクエリを「動的」にする必要があります。すべての列を有効/無効にできる必要があります。したがって、私が理解している限り、5 つのタグが必要です (bool としましょう)。私が持っているtag1=0, tag2=1, tag3=1, tag4=0, tag5 =0場合、選択ステートメントは次のようになります。

Select col2, col3 
from tbl

私が持っているtag1=1, tag2=0, tag3=0, tag4=0, tag5 =0場合、選択ステートメントは次のようになります。

Select col1 
from tbl

それで、TSQLでそうする可能性はありますか? SPを作成し、phpから実行するつもりです。

PsIF考えられるすべてのバリエーションを含む一連のステートメントを作成する解決策があることは理解していtag1...tag5ますが、これは列数 (および有効化タグ) が多い場合にはあまり効果的ではありません。

4

2 に答える 2

1
create procedure GetTblList
  @Tag1 bit,
  @Tag2 bit,
  @Tag3 bit,
  @Tag4 bit,
  @Tag5 bit
as

declare @SQL nvarchar(max)
set @SQL = 'select '

if @Tag1 = 1 set @SQL = @SQL + 'Col1,'
if @Tag2 = 1 set @SQL = @SQL + 'Col2,'
if @Tag3 = 1 set @SQL = @SQL + 'Col3,'
if @Tag4 = 1 set @SQL = @SQL + 'Col4,'
if @Tag5 = 1 set @SQL = @SQL + 'Col5,'
if @SQL = 'select ' set @SQL = @SQL + 'null as NoColumnSelected'

set @SQL = stuff(@SQL, len(@SQL), 1, ' from TbL')
exec (@SQL)
于 2013-01-15T07:10:08.330 に答える
0

推奨される方法ではありませんが、SQL ステートメントを文字列として作成し、それを実行する方法しかないようです。

アプリケーション層で sql ステートメント文字列を作成する場合は、それを単一の文字列として実行するために db 層に送信できます。これは明確なはずです。

一方、SQL ステートメント文字列を DB レベル (SP など) で作成する場合は、sp_executesql ストアド プロシージャを使用して実行できます。サンプル:

DECLARE @sql nvarchar(MAX); 
SET @sql = 'SELECT col1' 
IF @tag1 = 1 SET @sql = @sql + ', dynamic_col_1'; 
IF @tag2 = 1 SET @sql = @sql + ', dynamic_col_2'; 
IF @tag3 = 1 SET @sql = @sql + ', dynamic_col_3'; 
SET  @sql = @sql + ' FROM myTable' 
EXEC sp_executesql @sql;  

いずれの場合も、すべてのタグをパラメータとして送信する必要があるか、各桁がフラグを表す単一の 5 桁の文字列パラメータにそれらを集約することができます。

于 2013-01-15T07:13:30.550 に答える