我试图弄清楚为什么我的where子句会返回所有行。
我使用也包含csv的变量查询包含csv的列。我已经构建了一个存储函数来在csv上拆分变量,并返回一个包含一行的表,其中包含我想在LIKE运算符右侧拥有的内容。
示例:
存储的功能:
ALTER Function [dbo].[storedFunction]
(@Fields VARCHAR(MAX),
@Field_Name VARCHAR(MAX) = '')
RETURN @Tbl_Fields Table (FIELD Varchar(max))
AS
BEGIN
DECLARE @FIELD varchar(max) = REPLACE(@Fields, ',', '%''' + ' AND ' +
@Field_Name + ' Like ' + '''%');
INSERT INTO @Tbl_Fields
SELECT '''%' + @FIELD + '%'''
RETURN
END
使用存储的功能:
BEGIN
DECLARE @variable varchar(max) = 'variable1, variable3';
END
SELECT field
FROM storedFunction(@variable, 'main_csv_field');
返回'%variable1%' AND main_csv_field Like '%variable3%'
我的简化查询:
BEGIN
DECLARE @variable varchar(max) = 'variable1, variable3';
END
SELECT main_csv_field
FROM table
WHERE (main_csv_field LIKE (SELECT field
FROM storedFunction(@variable, 'main_csv_field');
返回
variable1,variable2,variable3,variable4,...
variable2,variable4,...
variable1,variable3,...
我的问题是这个最后一个查询返回表中的所有行,而不管值是否匹配。如果我要复制并粘贴从存储函数返回的值,我将得到我需要的数据。
这里有什么/有什么区别?
答案 0 :(得分:0)
感谢@Obie和@ AllanS.Hansen我知道从哪里开始寻找解决方法。它非常粗糙,但我想在兔子洞太远之前发布一个解决方案:
DECLARE variable1 varchar(max) = '' --around 9 passed from code
DECLARE @query nvarchar(max);
DECLARE @column_list varchar(max) = 'column1, column2, etc'
--one of each of the tests per variable passed from code
DECLARE @variable1_test nvarchar(max) = (SELECT CASE WHEN @variable = '' THEN '%' ELSE (SELECT * from dbo.stored_function(@variable, 'column_name')) END);
END;
SET @query = ' SELECT ' + @column_list + '
FROM table_name
WHERE variable LIKE ''' + @variable_test + ''' '
EXECUTE sp_executesql @query;
print(@query); --This is just to see the resulting query, which helped me a ton
刺激!现在我必须测试它。