【发布时间】:2014-09-26 04:05:19
【问题描述】:
我试图让一个复杂的存储过程工作,但我无法弄清楚存储过程、参数和 IF/THEN 语句之间的关系。
我已将我的代码剥离为附加的代码块,这表明我哪里出错了。当我执行它时,我得到一个错误
消息 156,第 15 级,状态 1,第 1 行
关键字“and”附近的语法不正确
基本上,我有 3 个变量 - @Test1、@Test2 和 @Test3。这些是执行存储过程时出现的提示。如果用户分别输入'1'、'2'、'3',它应该显示文本'Show 1 and 2 and 3 Plus Pivot Section'。如果只输入 '1','2' 它应该显示文本 'Show 1 and 2 Plus Pivot Section'。
下面是我的代码,我做错了吗??
ALTER PROCEDURE [dbo].[sp_Data_Extract_Test]
@Test1 [NVARCHAR] (400),
@Test2 [NVARCHAR] (400),
@Test3 [NVARCHAR] (400)
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Output NVARCHAR(400) ;
Declare @param NVARCHAR(900) ;
Set @param = '@Test1 nvarchar(400), @Test2 nvarchar(400), @Test3 nvarchar(400)'
if (@Test1 = '1')
BEGIN
SET @Output = 'Show 1';
END
if (@Test2 = '2')
BEGIN
SET @Output = @Output + ' and 2';
END
if (@Test3 = '3')
BEGIN
SET @Output = @Output + ' and 3';
END
BEGIN
SET @Output = @Output + ' Plus Pivot Section'
PRINT @Output
END
EXECUTE SP_EXECUTESQL @Output, @param, @Test1, @Test2, @Test3;
END
编辑:我上面的例子不是一个很好的例子。我试图缩小范围以确定问题,但似乎底部的 Execute 语句需要一个 SQL 语句,而不是一行文本。
我正在尝试做的实际上是以下内容。我想执行一个以数据集为中心的存储过程。数据由基于提示的 2 个附加(联合)构成。我想要它,以便用户可以为 1 种数量、2 或 3 种类型运行它。如果他们想查看所有 3 个数量,则需要执行 2 次附加。代码如下。我在 SQL 语句所在的位置添加了 XXX,因为我知道这些部分工作正常,只有当我尝试基于变量执行此 if 语句时,我才有可能过滤掉联合。
--- Above: Alter Stored Procedure, with variable declarations
declare @V1 NVARCHAR(4000) ;
declare @param NVARCHAR(900) ;
set @param='XXXXXX'
if (@Value1 = 'Qty_Ordered')
BEGIN
set @V1='SELECT XXXXXX’
END
if (@Value1 = 'Qty_Ordered' and @Value2 = 'Qty_Supplied')
BEGIN set @V1= @V1 + '
UNION ALL
SELECT XXXXX'
END
if ((@Value1 = 'Qty_Ordered' or @Value2 = 'Qty_Supplied') and @Value3 = 'Qty_Forecast')
BEGIN set @V1= @V1 +
'UNION ALL
SELECT XXXXXX’
END
BEGIN
set @V1 = @V1 + '
PIVOT
(
SUM([Value])
FOR p.forecast_Week_No IN ('+@cols1+','+@cols2+','+@cols3+')) AS pvt'
END
EXECUTE SP_EXECUTESQL @V1, @param, XXXXXXXX;
END
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
我认为问题在于您没有执行 sql 语句。如果我通过 1、2、3,
@output最终会变成Show 1 and 2 and 3 Plus Pivot Section。所以你的最终执行是execute sp_executesql 'Show 1 and 2 and 3 Plus Pivot Section...'
标签: sql sql-server if-statement stored-procedures parameters