我有一个包含3个复选框下拉列表的表单,可以从每个控件中进行多项选择。
让我们说话,它是我正在查询的住宿表,复选框下拉列表是' AccommodationName',' Company'' Nights'。
因此,我可能会从每个控件传递多个值,并且我想返回与所有数据输入相关的聚合查询。
我该如何处理此查询?
查询是否必须是动态sql?
请注意,我使用的是sql server 2005。
答案 0 :(得分:0)
您需要在数据库中创建一个拆分函数,
CREATE FUNCTION [dbo].[split]
(
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
)
RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
INSERT INTO @t(val)
SELECT r.value('.','varchar(MAX)') as item
FROM @xml.nodes('/t') as records(r)
RETURN
END
然后你需要创建一个存储过程,它将动态构建sql查询,并使用这个split函数来处理以逗号分隔列表形式传递的多个值。
CREATE PROCEDURE GetData
@AccommodationName VARCHAR(1000) = NULL,
@Company VARCHAR(1000) = NULL,
@Nights VARCHAR(1000) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' SELECT * FROM TableName WHERE 1 = 1 '
+ CASE WHEN @AccommodationName IS NOT NULL
THEN N' AND AccommodationName IN (SELECT Val FROM dbo.split(@AccommodationName )) '
ELSE N'' END
+ CASE WHEN @Company IS NOT NULL
THEN N' AND Company IN (SELECT Val FROM dbo.split(@Company)) '
ELSE N'' END
+ CASE WHEN @Nights IS NOT NULL
THEN N' AND Nights IN (SELECT Val FROM dbo.split(@Nights)) '
ELSE N'' END
EXECUTE sp_executesql @SQL
,N'@AccommodationName VARCHAR(1000), @Company VARCHAR(1000), @Nights VARCHAR(1000)'
,@AccommodationName
,@Company
,@Nights
END