Reputation: 610
what i want to do is to perform simple query to exclude unnecessary data, due to some requirement i have to use function to perform it, lets take a look on my sample data and query
Sample data in my table
ID | TITLE |
1 | A |
2 | B |
3 | C |
my function
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
result that returned by my function
'A','B'
my problems is here, when i trying to exclude the data, it doesnt work
SELECT TITLE FROM [MYTable] WHERE TITLE NOT IN (ufnTitleValue())
Original Result
TITLE
A
B
C
Expected Result
TITLE
C
i am so confused that why my function is not work, what is my mistake ? where did i goes wrong?
Upvotes: 0
Views: 49
Reputation: 10274
As pointed by @podiluska you can do it as:
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())
Upvotes: 0
Reputation: 51494
Your function doesn't work with your table, because the function returns a string "'A','B'"
IN
takes a list of values, either declared in code, or as a single column result from a query. It does not take a string.
So you are searching for entries in your table where the Title is not "'A','B'"
. And none of them are.
Change your function to return a table with a single column.
Upvotes: 1