动态 WHERE 条件 SQL SERVER
Dynamic WHERE condition SQL SERVER
我有以下要求。当 FirstName 出现时,我应该 return 唯一的 condtionFirstName 当 LastName 出现时我应该 return 唯一的 condtionlastName 当 First 和 email 都存在时我应该 return condtionFirstName + condtionEmail.
基本上无论出现哪个值我都应该return那个条件,如果1值1条件,如果1和2则条件1和2,如果1和3则条件1和3,如果只有3则条件 3.
请帮助我理解这个逻辑。
DECLARE @FirstName NVARCHAR(100)
DECLARE @LastName NVARCHAR(100)
DECLARE @Email NVARCHAR(200)
DECLARE @condtionFirstName NVARCHAR(200)
DECLARE @condtionlastName NVARCHAR(200)
DECLARE @condtionEmail NVARCHAR(200)
SET @FirstName = 'JOhn'
SET @LastName = 'David'
SET @Email = 'john.david@abc.com'
SET @condtionFirstName = ' AND FirstName = ' + '''' + @FirstName + ''''
SET @condtionlastName = ' AND LastName = ' + '''' + @LastName + ''''
SET @condtionEmail = ' AND Email = ' + '''' + @Email + ''''
这就是我长期以来所说的“the kitchen sink”- 您需要一个可以支持搜索条件的任意组合的查询。一些想法:
- 停止尝试将用户输入与可执行字符串连接起来 - 这是危险且容易出错的。这些应始终作为显式类型参数传入。
- 您可以构建一个包含所有条件的字符串,而不是尝试为每个可能的条件创建一个新的条件字符串。
- 您可以声明参数并将其传递给
sp_executesql
,即使它们并未全部以动态 SQL 语句结尾。这就像声明一个局部变量而不使用它一样。
- 电子邮件地址的长度可以是 320 个字符。如果你只支持 200,那可能会咬你。
样本:
DECLARE @FirstName nvarchar(100),
@LastName nvarchar(100),
@Email nvarchar(320),
@conditions nvarchar(max) = N'';
SET @FirstName = N'John';
SET @LastName = N'David';
SET @Email = N'john.david@abc.com';
SET @conditions += CASE WHEN @FirstName IS NOT NULL THEN
N' AND FirstName = @FirstName' ELSE N'' END
+ CASE WHEN @LastName IS NOT NULL THEN
N' AND LastName = @LastName' ELSE N'' END
+ CASE WHEN @Email IS NOT NULL THEN
N' AND Email = @Email' ELSE N'' END;
DECLARE @sql nvarchar(max) = N'SELECT ... FROM dbo.table
WHERE 1 = 1' + @conditions;
PRINT @sql; -- try this when populating or not populating each of
-- @FirstName, @LastName, @Email
EXEC sys.sp_executesql @sql,
N'@FirstName nvarchar(100), @LastName nvarchar(100), @Email nvarchar(320)',
@FirstName, @LastName, @Email;
更多详情:
我有以下要求。当 FirstName 出现时,我应该 return 唯一的 condtionFirstName 当 LastName 出现时我应该 return 唯一的 condtionlastName 当 First 和 email 都存在时我应该 return condtionFirstName + condtionEmail.
基本上无论出现哪个值我都应该return那个条件,如果1值1条件,如果1和2则条件1和2,如果1和3则条件1和3,如果只有3则条件 3.
请帮助我理解这个逻辑。
DECLARE @FirstName NVARCHAR(100)
DECLARE @LastName NVARCHAR(100)
DECLARE @Email NVARCHAR(200)
DECLARE @condtionFirstName NVARCHAR(200)
DECLARE @condtionlastName NVARCHAR(200)
DECLARE @condtionEmail NVARCHAR(200)
SET @FirstName = 'JOhn'
SET @LastName = 'David'
SET @Email = 'john.david@abc.com'
SET @condtionFirstName = ' AND FirstName = ' + '''' + @FirstName + ''''
SET @condtionlastName = ' AND LastName = ' + '''' + @LastName + ''''
SET @condtionEmail = ' AND Email = ' + '''' + @Email + ''''
这就是我长期以来所说的“the kitchen sink”- 您需要一个可以支持搜索条件的任意组合的查询。一些想法:
- 停止尝试将用户输入与可执行字符串连接起来 - 这是危险且容易出错的。这些应始终作为显式类型参数传入。
- 您可以构建一个包含所有条件的字符串,而不是尝试为每个可能的条件创建一个新的条件字符串。
- 您可以声明参数并将其传递给
sp_executesql
,即使它们并未全部以动态 SQL 语句结尾。这就像声明一个局部变量而不使用它一样。 - 电子邮件地址的长度可以是 320 个字符。如果你只支持 200,那可能会咬你。
样本:
DECLARE @FirstName nvarchar(100),
@LastName nvarchar(100),
@Email nvarchar(320),
@conditions nvarchar(max) = N'';
SET @FirstName = N'John';
SET @LastName = N'David';
SET @Email = N'john.david@abc.com';
SET @conditions += CASE WHEN @FirstName IS NOT NULL THEN
N' AND FirstName = @FirstName' ELSE N'' END
+ CASE WHEN @LastName IS NOT NULL THEN
N' AND LastName = @LastName' ELSE N'' END
+ CASE WHEN @Email IS NOT NULL THEN
N' AND Email = @Email' ELSE N'' END;
DECLARE @sql nvarchar(max) = N'SELECT ... FROM dbo.table
WHERE 1 = 1' + @conditions;
PRINT @sql; -- try this when populating or not populating each of
-- @FirstName, @LastName, @Email
EXEC sys.sp_executesql @sql,
N'@FirstName nvarchar(100), @LastName nvarchar(100), @Email nvarchar(320)',
@FirstName, @LastName, @Email;
更多详情: