目标:我正在构建一个动态SQL字符串,并希望将搜索设为AND函数
代码类型:SQL Server Management Studio中的SQL存储过程
问题:如果不需要第一次搜索,那么我需要知道这一点(我知道,因为在这种情况下,默认值是' 0'。我觉得我错过了一个保姆而不是#&# 39;似乎能够通过stackoverflow / Google获得解决方案。
我设置@QueryString,默认为''所以功能将起作用。
什么能解决这个问题?:
我已经考虑过COALESCE和IF ELSE在IF中的潜在用途,但我希望有一个干净的解决方案
SET @QUERYSTRING = IF(@QUERYSTRING = '','', + + ' FIELD1 LIKE ''%' + LTRIM(RTRIM(@s1)) + '%' )
当前示例(摘录):
ALTER PROCEDURE [dbo].[spGridSearchTest]
@s1 NVARCHAR(20),
@s2 VARCHAR(20)
AS
BEGIN
DECLARE @QUERY NVARCHAR(MAX) = ''
DECLARE @QUERYSTRING NVARCHAR(MAX) = ''
SET @QUERY = 'SELECT * FROM TblTable'
IF @s1 <> '1234xyz'
SET @QUERYSTRING = @QUERYSTRING + ' Field1 LIKE ''%' + LTRIM(RTRIM(@s1)) + '%'
IF @s2 <> '1234xyz'
SET @QUERYSTRING = @QUERYSTRING + ' Field2 LIKE ''%' + LTRIM(RTRIM@s2)) + '%'
IF LEN(LTRIM(RTRIM(@QUERYSTRING))) > 0
SET @QUERY = LTRIM(RTRIM(@QUERY)) + ' WHERE ' + LTRIM(RTRIM(@QUERYSTRING)) + ''''
EXECUTE(@QUERY)
END
答案 0 :(得分:1)
如果我更了解你的问题:
试试这个:
ALTER PROCEDURE [dbo].[spGridSearchTest]
@s1 NVARCHAR(20),
@s2 VARCHAR(20)
AS
BEGIN
DECLARE @QUERY NVARCHAR(MAX) = ''
DECLARE @QUERYSTRING NVARCHAR(MAX) = ''
DECLARE @conditionadded char(1) = 'N'
SET @QUERY = 'SELECT * FROM TblTable'
IF @s1 <> '1234xyz'
BEGIN
SET @QUERYSTRING = ' Field1 LIKE ''%' + LTRIM(RTRIM(@s1)) + '%'
SET @conditionadded = 'Y'
END
IF @s2 <> '1234xyz'
BEGIN
IF (@conditionadded = 'Y')
BEGIN
SET @QUERYSTRING = @QUERYSTRING + ' AND '
END
SET @QUERYSTRING = @QUERYSTRING + ' Field2 LIKE ''%' + LTRIM(RTRIM@s2)) + '%'
SET @conditionadded = 'Y'
END
IF (@conditionadded = 'Y')
BEGIN
SET @QUERY = LTRIM(RTRIM(@QUERY)) + ' WHERE ' + LTRIM(RTRIM(@QUERYSTRING)) + ''''
END
EXECUTE(@QUERY)
END
答案 1 :(得分:0)
您真的需要动态查询吗?为什么不使用这样的东西:
select
Whatever
from MyTable
where
(@s1 = '1234xyz' or Field1 = @s1)
and
(@s2 = '1234xyz' or Field2 = @s2)
这可以避免安全漏洞,并且根据您的查询模式和数据集,它甚至可能更快。当然,它很容易阅读,你不必在字符串中处理SQL:)