【问题标题】:SQL - If Parameters within Stored ProcedureSQL - If 存储过程中的参数
【发布时间】: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


【解决方案1】:

sp_executesql 的第一个参数应该是 TSQL 语句,但 @Output 不代表它。 如果您的意图只是打印消息,请评论 EXECUTE SP_EXECUTESQL @Output、@param、@Test1、@Test2、@Test3;


现在关于 Msg 156, Level 15, State 1, Line 1 关键字“和”附近的语法错误

sqlserver 基本上检查了通过@Output 传递的TSQL stmt 中的语法错误,
它得到的是“显示 1 和 2 和 3 Plus Pivot 部分”
由于 SHOW 不是 SQL stmt,它认为它是一个存储过程,
接下来查看11允许作为参数
接下来得到“and”,执行SP时不接受使用“and”之类的词
所以给出了语法错误Msg 156, Level 15, State 1...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多