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

我的函数返回的结果

 'A','B'

我的问题就在这里,当我尝试排除数据时,它不起作用

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

原始结果

TITLE
A
B
C

预期结果

TITLE
C

我很困惑,为什么我的功能不起作用,我的错误是什么?我哪里出错了?

4

2 回答 2

1

您的函数不适用于您的表,因为该函数返回一个字符串"'A','B'"

IN接受一个值列表,要么在代码中声明,要么作为查询的单列结果。它不需要字符串。

因此,您正在表中搜索 Title 不是的条目"'A','B'"。他们都不是。

更改您的函数以返回具有单列的表。

于 2013-10-18T08:39:36.353 回答
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())
于 2013-10-18T09:11:38.600 回答