2012-05-29 312 views
0

我有一個動態的sql語句,可能會也可能不會返回任何結果。爲了簡便起見:如果沒有結果返回null而不是沒有結果

--other SQL statements defining @a 
DECLARE @sql varchar(128) 
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a 
EXEC(@sql) 

我想要的結果,如果此語句返回任何但是如果EXEC(@sql)不返回任何結果我怎麼能去使它回到一個null呢?

我與MS SQLServer的2000

說明工作X-ZERO

這是在一個Web應用Ajax響應使用。我無法改變後端java框架,它需要查詢返回到webservice的某種結果集。

SOLUTION

如果任何人有這個問題,因爲它不是在答案完全清楚,這個工作:

--other SQL statements defining @a 
DECLARE @sql varchar(128) 
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a 
EXEC(@sql) 
IF @@ROWCOUNT = 0 SELECT null 
+1

所以,而不是結果表,你想要一個單一的字符串?我想你可以用'COALESCE()'做些事情,但是這讓我感到非常麻煩。 _你爲什麼做這個? –

+0

@ X-Zero抱歉,沒有字符串我的意思是一個實際的'空'我會更清楚。我將在上面添加解釋。 – Geronimo

+0

如果您將此作爲後端Web服務的一部分,是否可以檢查返回的行的查詢元信息,並從運行查詢的任何函數中返回null(我認爲@Barry建議這樣做,但我'米不確定)。 –

回答

1

你可以得到語句的結果集的記錄數以相同的WHERE子句,它是零,那麼你就可以只需返回一個空值的記錄。

例子:

declare @sql varchar(128) 
declare @a varchar(10); 
set @a = '''Some @a value'''; 

declare @rowcount int; 
exec sp_executesql N'select @rowcount=count(*) FROM c WHERE a = ''Some @a value''', 
        N'@rowcount int output', @rowcount output; 

if @rowcount <> 0 
begin 
    select @sql = 'SELECT a, b FROM c WHERE a = ' + @a 
end 
else 
begin 
    select @sql = 'select null'; 
end 

exec(@sql)     ; 

希望這可以幫助你!

+0

添加了一個完整的示例(未經測試,但可能工作):D,以幫助其他人在將來查看此問題。 – jfoliveira

+0

「WHERE NOT EXISTS」版本可能比計數行更有效(特別是如果計數很大),以及更好地傳達目的。 –

1

如果我理解你的問題,你想要的聲明返回從實際查詢返回沒有行時由null組成的單個行。換句話說,當它應該返回沒有值的時候,你希望它返回一個值(空)。

我認爲你應該做的就是保持原樣查詢並獲得該語句返回的行數。我相信你可以在做查詢後用@@rowcount變量做到這一點。

(聲明:我所知道的有關SQL Server,我從谷歌的教訓和SO)

0

避免@@ROWCOUNT的另一種選擇是將結果保存在表變量中,然後返回結果(如果存在)或NULL(如果不存在)。例如:

DECLARE @results TABLE(a int, b int) 
DECLARE @sql nvarchar(128) 
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a 

insert into @results 
exec (@sql) 

IF EXISTS(select top 1 * from @results) 
SELECT * from @results 
ELSE SELECT null