有一个与MS SQL Server有关的查询。
我将不得不模糊细节,更改或删除某些部分,因为我无法说明信息是否保密,但我写了一个查询,搜索他们的培训单位跨越的学生跨学期使用report builder 2.0:
DS_spanning :(主要数据集)
SET DATEFORMAT dmy
SELECT
FIRST_NAME AS FirstName
,LAST_NAME AS LastName
,START_DATE AS StartDate
,END_DATE AS EndDate
,UNIT_TYPE AS UnitType
,TP_FULLNAME AS TrainingPost
,SEMESTER_YEAR AS SemesterYear
FROM AA_GPR_TU
WHERE TU_START_DATE < @checkdate //Checkdate returns the end date of the
AND TU_END_DATE > @checkdate // selected semester
ORDER BY TU_START_DATE
PM_checkdate :( @checkdate链接到的数据集)
SET DATEFORMAT dmy
SELECT
new_semesterenddate
,new_semesterstartdate
,new_semesternumber
,new_semesteryear
,new_name
FROM
FilteredNew_rtpsemester
WHERE new_semesteryear >= 2004
ORDER BY new_semesterenddate DESC
现在,这样可以正常工作并完成我想要的工作,但是我一次只能选择一个学期。当我尝试勾选@checkdate的报告参数属性下的“允许多个值”框时,运行包含多个学期的报告会给我这个错误:
','附近的语法不正确。
数据集“DS_spanning”的查询执行失败。
报告处理期间发生错误。
本地报告处理期间发生错误。**
(','的问题是因为当我为报告选择多个值时,它会将它们作为data1,data2,data3等提供给@checkdate。)
我的参数编写方式有问题,还是我需要更改查询以容纳多个值?
我能想到的最简单方法是在
部分使用IN语句在哪里TU_START_DATE&lt; @checkdate AND TU_END_DATE&gt; @checkdate
但我不确定如何将IN语句与and
个操作数一起使用。
任何想法的人?
答案 0 :(得分:2)
我已经多次选择了多个价值问题,在网上搜索了好几个小时之后,我发现了这个问题并且很有效。
首先创建此函数调用split分割到您正在运行查询的数据库中。
USE [DatabaseName]
GO
/****** Object: UserDefinedFunction [dbo].[split] Script Date: 07/19/2013 10:49:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
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
然后在WHERE子句中使用它的方法是使用这行代码确保更改单词列和参数保留单词val,因为这是函数所需的
WHERE [COLUMN] IN (SELECT val FROM dbo.split(@Parameter, ','))
答案 1 :(得分:1)
对多个参数使用相同的数据集没有任何限制。
您应该为此报告使用2个参数,例如@checkdate1
和@checkdate2
,因为这样可以更好地控制使用的内容和位置。