创建一个可以处理多个复选框选择的SQL查询

时间:2014-07-15 15:27:05

标签: sql-server sql-server-2008 sql-server-2005

我有一个包含3个复选框下拉列表的表单,可以从每个控件中进行多项选择。

让我们说话,它是我正在查询的住宿表,复选框下拉列表是' AccommodationName',' Company'' Nights'。

因此,我可能会从每个控件传递多个值,并且我想返回与所有数据输入相关的聚合查询。

我该如何处理此查询?

查询是否必须是动态sql?

请注意,我使用的是sql server 2005。

1 个答案:

答案 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