SQL - 如果存储过程中的参数

时间:2014-09-26 04:05:20

标签: sql sql-server if-statement stored-procedures parameters

我试图让复杂的存储过程起作用,但我无法弄清楚存储过程,参数和IF / THEN语句之间的关系。

我已将代码删除到附加的代码块,这表明我出错了。当我执行它时,我收到错误

  

第15行,第1行,第1行,第1行   关键字'和'

附近的语法不正确

基本上,我有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个附加。代码如下。我已经添加了XXX的SQL语句,因为我知道这些部分工作正常,只有当我尝试执行此操作时,如果语句基于变量,那么我可能会过滤掉联合。

--- 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

1 个答案:

答案 0 :(得分:1)

sp_executesql 的frist参数应该是TSQL语句,但@Output不代表。 如果您打算只打印消息,请发表评论执行 SP_EXECUTESQL @Output,@ param,@ Test1,@ Test2,@ Test3;


现在关于消息156,级别15,状态1,行1关键字'和' 附近的语法不正确

sqlserver基本上检查了通过@Output传递的TSQL stmt中的语法错误, 它得到的是" Show 1 and 2和3 Plus Pivot Section"
由于 SHOW 不是SQL stmt,因此将其视为存储过程,
接下来它看了 1 1 它被允许作为参数
接下来它有"和#34; ,在执行SP时不接受使用像"和#34; 这样的字词
因此给出了语法错误消息156,级别15,状态1 ...