我想要做的是执行简单查询以排除不必要的数据,由于某些要求我必须使用函数来执行它,让我们来看看我的示例数据和查询
我表格中的示例数据
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
我很困惑,为什么我的功能不起作用,我的错误是什么?我哪里出错?
答案 0 :(得分:1)
您的函数不适用于您的表,因为该函数返回字符串"'A','B'"
IN
获取值列表,可以在代码中声明,也可以作为查询的单列结果。它不需要字符串。
因此,您要在表格中搜索标题不是"'A','B'"
的条目。而且他们都不是。
更改您的函数以返回包含单列的表。
答案 1 :(得分: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())