使用动态 SQL 在一个参数中对多个列执行通配符搜索
Perform wildcard searches with multiple columns in one parameter using dynamic SQL
我的应用程序只有街道号码和街道名称字段。我需要在查询中将街道名称和单元类型声明为一个参数字段。我需要按任何值执行通配符搜索(在街道名称字段上)和 return 以下结果。
可能的搜索:
Street Number: 1234
Street Name:
OR
Street Number: 1234
Street Name: Lakeshore SE
OR
Street Number:
Street Name: SE
OR
Street Number:
Street Name: Lake DR SE
这是 table 结果:
+-----------------------------------+-------------------+-----------+
| STREET_NUMBER | STREET_NAME | UNIT_TYPE |
+-----------------------------------+-------------------+-----------+
| 1234 | LAKESHORE DR | SE |
+-----------------------------------+-------------------+-----------+
这是我的存储过程:
@Street varchar (100) = NULL
,@StreetNumber varchar (100) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max) = N'
SELECT *
FROM ADDRESS_DETAIL
WHERE 1 = 1'
+ CASE WHEN @Street IS NOT NULL THEN
N' AND STREET_NAME + UNIT_TYPE LIKE ''%'' + @Street + ''%''' ELSE N'' END
+ CASE WHEN @StreetNumber IS NOT NULL THEN
N' AND STREET_NUMBER LIKE @StreetNumber' ELSE N'' END
DECLARE @params nvarchar(max) = N'
@Street varchar (60)
,@StreetNumber varchar (60)';
PRINT @sql;
EXEC sys.sp_executesql @sql, @params,
@Street,
@StreetNumber;
END
动态参数化的主要荣誉 sql。这不是我看到大多数人所做的事情。但我认为您在这里不需要动态 sql 。我有点担心这里的前导通配符,因为它使查询不可搜索。但动态 sql 与否都是如此。
这里是编写此过程的另一种方法,可能会更简单一些。
create procedure YourProc
(
@Street varchar (100) = NULL
,@StreetNumber varchar (100) = NULL
) AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM ADDRESS_DETAIL
WHERE
(
STREET_NAME + UNIT_TYPE LIKE '%' + @Street + '%'
OR
@Street IS NULL
)
AND
(
STREET_NUMBER LIKE '%' + @StreetNumber + '%'
OR
@StreetNumber IS NULL
)
END
我的猜测是您需要将第一个谓词更改为类似这样的内容。
@Street like '%' + STREET_NAME + '%' + UNIT_TYPE + '%'
另一个想法...您可以用通配符替换所有空格以消除导致问题的多个空格。
where STREET_NAME + UNIT_TYPE like replace('@STREET', ' ', '%')
我的应用程序只有街道号码和街道名称字段。我需要在查询中将街道名称和单元类型声明为一个参数字段。我需要按任何值执行通配符搜索(在街道名称字段上)和 return 以下结果。 可能的搜索:
Street Number: 1234
Street Name:
OR
Street Number: 1234
Street Name: Lakeshore SE
OR
Street Number:
Street Name: SE
OR
Street Number:
Street Name: Lake DR SE
这是 table 结果:
+-----------------------------------+-------------------+-----------+
| STREET_NUMBER | STREET_NAME | UNIT_TYPE |
+-----------------------------------+-------------------+-----------+
| 1234 | LAKESHORE DR | SE |
+-----------------------------------+-------------------+-----------+
这是我的存储过程:
@Street varchar (100) = NULL
,@StreetNumber varchar (100) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max) = N'
SELECT *
FROM ADDRESS_DETAIL
WHERE 1 = 1'
+ CASE WHEN @Street IS NOT NULL THEN
N' AND STREET_NAME + UNIT_TYPE LIKE ''%'' + @Street + ''%''' ELSE N'' END
+ CASE WHEN @StreetNumber IS NOT NULL THEN
N' AND STREET_NUMBER LIKE @StreetNumber' ELSE N'' END
DECLARE @params nvarchar(max) = N'
@Street varchar (60)
,@StreetNumber varchar (60)';
PRINT @sql;
EXEC sys.sp_executesql @sql, @params,
@Street,
@StreetNumber;
END
动态参数化的主要荣誉 sql。这不是我看到大多数人所做的事情。但我认为您在这里不需要动态 sql 。我有点担心这里的前导通配符,因为它使查询不可搜索。但动态 sql 与否都是如此。
这里是编写此过程的另一种方法,可能会更简单一些。
create procedure YourProc
(
@Street varchar (100) = NULL
,@StreetNumber varchar (100) = NULL
) AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM ADDRESS_DETAIL
WHERE
(
STREET_NAME + UNIT_TYPE LIKE '%' + @Street + '%'
OR
@Street IS NULL
)
AND
(
STREET_NUMBER LIKE '%' + @StreetNumber + '%'
OR
@StreetNumber IS NULL
)
END
我的猜测是您需要将第一个谓词更改为类似这样的内容。
@Street like '%' + STREET_NAME + '%' + UNIT_TYPE + '%'
另一个想法...您可以用通配符替换所有空格以消除导致问题的多个空格。
where STREET_NAME + UNIT_TYPE like replace('@STREET', ' ', '%')