2

有一个与 MS SQL Server 相关的查询。

我将不得不对细节含糊不清,并更改或删除某些部分,因为我不能说信息是否保密,但我写了一个查询,搜索跨越学期的培训单元的学生报告生成器 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 语句

WHERE TU_START_DATE < @checkdate AND TU_END_DATE > @checkdate

但我不确定如何将 IN 语句与and操作数结合使用。

有什么想法吗?

4

2 回答 2

2

我已经多次选择多值问题,在互联网上搜索了数小时后,我发现了这个,它很有效。

首先,将此函数调用拆分到您正在从中运行查询的数据库中。

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 子句中使用它的方式是使用这行代码确保更改单词 column 和参数保留单词 val 因为这是函数所需要的

WHERE [COLUMN] IN (SELECT val FROM dbo.split(@Parameter, ','))
于 2013-07-19T09:56:23.490 回答
1

将同一数据集用于多个参数将没有任何限制。

您应该为此报告使用 2 个参数,例如@checkdate1@checkdate2,因为这样可以更好地控制使用的内容和位置。

于 2012-12-19T09:34:48.537 回答