1
declare @pid int
declare @mid int
declare @tableName varchar(10)
declare @query nvarchar(1000)
declare @subquery nvarchar(300)

set @pid = 1
set @mid = 2
set @query = 'Select * from '+@tableName+' where'

if(@pid is not null)
begin
set @query = @query+' pid ='+@pid+' and'
end

if(@mid is not null)
begin
set @query = @query+' mid ='+@mid+' and'
end

@pid と @mid が null でない場合は、クエリに追加されます。@pid と @mid が null の場合、クエリから「where」を削除したい。両方が選択された場合、「and」も同様です。

set @subquery = select right('''+@query+''',5)
if(@subquery = 'where')
begin
print @query
-- execute sp_executesql @query
end

if 句でそれらを比較することはできません。@subquery を実行する必要がありますか。はいの場合、その値をどのように取得しますか?

4

1 に答える 1

2

@pid と @mid が null でない場合、クエリに追加されます。

@pid と @mid が null の場合、クエリから「where」を削除したい。どちらも選ばれます。

私はあなたがこのようなものを探していると思います:

WHERE 1 = 1
  AND (@mid IS NULL OR mid = @mid )
  AND (@pid IS NULL OR pid = @pid)

@pid@midが s でない場合NULL、前のは次のWHEREようになります。

WHERE 1 = 1
  AND mid = @mid 
  AND pid = @pid

したがって、それらはクエリに追加されます。

@pid@midNULLs の場合、WHERE節は次のようになります。

WHERE 1 = 1

したがって、存在しないようになります。

2 つのとが両方ともWHERE 1 = 1である場合に使用したことに注意してください。クエリは機能し続け、壊れません。@pid@midNULL

于 2012-09-03T09:52:07.597 に答える