2013-10-18 56 views
0

我想要做的是執行簡單的查詢來排除不必要的數據,由於一些要求我必須使用函數來執行它,讓我們看看我的示例數據和查詢我的查詢不起作用我的功能

在我的表

ID | TITLE | 
1 |  A  | 
2 |  B  | 
3 |  C  | 

我的功能

CREATE FUNCTION ufnTitleValue() 
RETURNS NVARCHAR(255) 
AS 
BEGIN 
DECLARE @Val NVARCHAR(MAX) 

SELECT @Val = STUFF((SELECT ''',''' + TITLE FROM [MyTable] 
WHERE TITLE IN('A','B') 
FOR XML PATH('')),1,2,' ') 
SET @Val = @Val + '''' 

IF @Val IS NULL 
RETURN '' 

RETURN @Val 
END 

結果,通過我的功能

01返回

的樣本數據

'A','B' 

我的問題就在這裏,當我試圖排除的數據,它不工作

SELECT TITLE FROM [MYTable] WHERE TITLE NOT IN (ufnTitleValue()) 

原始結果

TITLE 
A 
B 
C 

預期結果

TITLE 
C 

我很困惑那爲什麼我的功能不起作用,我的錯誤是什麼?我哪裏錯了?

回答

1

你的功能不與你的工作表中,因爲該函數返回一個字符串"'A','B'"

IN取值的列表,在代碼中任何聲明,也從一個查詢的單列結果。它不需要一個字符串。

因此,您正在尋找表格中標題不是"'A','B'"的條目。他們都不是。

改變你的函數返回一個單列的表。

+0

所以要想解決,動態查詢是我唯一的選擇嗎? –

0

正如指出的@podiluska你可以做到這一點是:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ufnTitleValue]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[ufnTitleValue] 
GO 

CREATE FUNCTION ufnTitleValue() 
RETURNS TABLE 
AS 
return 
select TITLE 
FROM [MyTable] 
WHERE TITLE IN('A','B') 

Go 

SELECT TITLE FROM [MYTable] WHERE TITLE NOT IN (select * from dbo.ufnTitleValue()) 
+0

嗨deepshikha,因爲podiluska第一次教我,所以我標記他的答案=) –