我试图让复杂的存储过程起作用,但我无法弄清楚存储过程,参数和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
答案 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 ...