2013-10-18 14 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第一次教我,所以我标记他的答案=) –