Sql server 创建可以处理多个复选框选择的sql查询
我有一个带有3个复选框下拉列表的表单,可以从每个控件中进行多个选择 比如说,为了方便交谈,我正在查询一张住宿表,复选框下拉列表是“住宿名称”、“公司”和“夜晚” 因此,我可能会从每个控件传入多个值,并希望返回与所有数据输入相关的聚合查询 我应该如何处理这个问题 查询必须是动态sql吗Sql server 创建可以处理多个复选框选择的sql查询,sql-server,sql-server-2008,sql-server-2005,Sql Server,Sql Server 2008,Sql Server 2005,我有一个带有3个复选框下拉列表的表单,可以从每个控件中进行多个选择 比如说,为了方便交谈,我正在查询一张住宿表,复选框下拉列表是“住宿名称”、“公司”和“夜晚” 因此,我可能会从每个控件传入多个值,并希望返回与所有数据输入相关的聚合查询 我应该如何处理这个问题 查询必须是动态sql吗 请注意,我使用的是sql server 2005。您需要在数据库中创建一个拆分函数 分裂函数的定义 当您选择多个值时,应用程序是否会创建一个逗号分隔的值列表?动态sql、分隔数据或xml是常用的方法。sql2008
请注意,我使用的是sql server 2005。您需要在数据库中创建一个拆分函数 分裂函数的定义
当您选择多个值时,应用程序是否会创建一个逗号分隔的值列表?动态sql、分隔数据或xml是常用的方法。sql2008以后,您可以使用表值参数。XML将是我研究的选择。如果操作正确,分隔数据可以工作,但它总是让我畏缩。另一种方法是将每个复选框视为位,并将它们“按位或”放在一起,即1、2、4,并将它们保存为表中的单个整型字段。
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
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