我正在尝试在SQL Server中运行存储过程,并且我得到0结果。我最初运行得很好(附加到SSRS),但随后用户请求ProviderName参数的多值输入,我意识到我在我脑海中。我联系了我们的供应商,他提供了一篇我基本上复制并粘贴的知识库文章。见下文......
ALTER PROCEDURE [dbo].[Test]
(@dStartDate DATETIME
,@dEndDate DATETIME
,@nProviderName VARCHAR(MAX)
,@nAllProviderName VARCHAR(1) = 'N')
AS
BEGIN
DECLARE @dStart AS DATETIME = CONVERT(DATETIME,CONVERT(DATE,@dStartDate)) ;
DECLARE @dEnd AS DATETIME = DATEADD(ms,-3, DATEADD(day,1,CONVERT(DATETIME,CONVERT(DATE,@dEndDate))))
DECLARE @cProviderName AS VARCHAR(MAX) = @nProviderName
DECLARE @tProviderName AS TABLE (PCPID VARCHAR(MAX) NOT NULL);
IF UPPER(@nAllProviderName) = 'N'
BEGIN
INSERT INTO @tPCPName ( PCPID )
SELECT LTRIM(RTRIM(Item))
FROM [dbo].[Auto_Split]('|',@nProviderName ) ;
END;
SELECT ...
WHERE
([TestMnemonic] = 'GLU' OR
[TestMnemonic] = '%HA1C')
AND [Status] != 'DIS CLI'
AND [TextLine] IS NOT NULL
AND [DateTime] BETWEEN @dStart AND @dEnd
AND (UPPER(@nAllProviderName) = 'Y' OR
[PCPID] COLLATE DATABASE_DEFAULT
IN (SELECT PCPID FROM @tProviderName ) ) ;
END
因此,如果我注释掉最后4行代码,它运行正常。所以它最后一点(或顶部的东西?)我希望这是一个快速解决方案,任何和所有的帮助表示赞赏!
谢谢!
答案 0 :(得分:0)
我认为你需要在最后一行用@tPCPName切换@tProviderName。
如果你的@nAllProviderName是“N”而不是从名为@tPCPName的内存表中搜索PCPID
并且有一些代码缺失,所以我没有得到完整的图片..如果你可以把你的来自并加入你的错误“where子句”,当你的@nAllProviderName是“Y”时
并且您在SQL中不需要此部分
IF UPPER(@nAllProviderName) = 'N'
BEGIN
INSERT INTO @tPCPName ( PCPID )
SELECT LTRIM(RTRIM(Item))
FROM [dbo].[Auto_Split]('|',@nProviderName ) ;
END
如果您使用
切换最后一行 AND (UPPER(@nAllProviderName) = 'Y' OR
[PCPID] COLLATE DATABASE_DEFAULT
IN ( SELECT LTRIM(RTRIM(Item))
FROM [dbo].[Auto_Split]('|',@nProviderName ) ) ) ;
答案 1 :(得分:0)
我对底部的Collate声明感到好奇。我们的系统默认是什么,在与你制作的临时表进行比较时,你真的需要它吗?
没有整理
OR [PCPID] IN (SELECT PCPID FROM @tProviderN