当前位置: 首页 > 面试题库 >

在存储过程中“必须声明表变量”名称”

西门京
2023-03-14
问题内容

我有一个返回错误的过程:

必须声明表变量“ @PropIDs”。

但随后出现以下消息:

(受影响的123行)

使用以下命令执行时出现错误

EXEC [dbo].[GetNeededProperties] '1,3,5,7,2,12', '06/28/2013', 'TT'

但是在以下情况下可以正常工作

EXEC [dbo].[GetNeededProperties] NULL, '06/28/2013', 'TT'

有人可以帮我吗?步骤:

CREATE PROCEDURE [dbo].[GetNeededProperties]
@NotNeededWPRNs nvarchar(max), --string like '1,2,3,4,5'
@LastSynch datetime,
@TechCode varchar(5)
AS
BEGIN

DECLARE @PropIDs TABLE
(ID bigint)
Declare @ProductsSQL nvarchar(max);
SET @ProductsSQL = 'Insert into @PropIDs (ID) 
SELECT [WPRN] FROM [dbo].[Properties] WHERE(WPRN in (' + @NotNeededWPRNs + '))'
exec sp_executesql @ProductsSQL

SELECT  p.WPRN AS ID,
p.Address  AS Address,
p.Address AS Street
  FROM [dbo].[Properties] AS p
WHERE 
   p.WPRN NOT IN( SELECT ID FROM @PropIDs)

我在声明这样的表时找到了一种解决方案:

IF OBJECT_ID('#PropIDs', 'U') IS NOT NULL
  DROP TABLE #PropIDs

CREATE  TABLE  #PropIDs

但是,当从C#(linq html" target="_blank">sql)执行过程时,它将返回错误


问题答案:

问题在于您正在将动态SQL与非动态SQL混淆在一起。

首先-将NULL放入@NotNeededWPRNs时起作用的原因是,当该变量为NULL时,您的@ProductsSQL变为NULL。

您需要做的是使@PropsIDs表成为非表变量,并使之成为临时表或物理表。或者,您需要将所有内容包装在动态SQL中并执行。

因此,简单的方法是执行以下操作:

Declare @ProductsSQL nvarchar(max);
    SET @ProductsSQL = '
    DECLARE @PropIDs TABLE
    (ID bigint)
    Insert into @PropIDs (ID) 
    SELECT [WPRN] FROM [dbo].[Properties] WHERE(WPRN in (' + @NotNeededWPRNs + '))

    SELECT  p.WPRN AS ID,
    p.Address  AS Address,
    p.Address AS Street
      FROM [dbo].[Properties] AS p
    WHERE 
       p.WPRN NOT IN( SELECT ID FROM @PropIDs)
    '

并执行。或如前所述-将@ProdIDs更改为临时表。(您正在CREATE



 类似资料:
  • 本文向大家介绍MySQL 声明变量及存储过程分析,包括了MySQL 声明变量及存储过程分析的使用技巧和注意事项,需要的朋友参考一下 声明变量 设置全局变量 set @a='一个新变量'; 在函数和储存过程中使用的变量declear declear a int unsigned default 1; 这种变量需要设置变量类型 而且只存在在 begin..end 这段之内 select .. into

  • 问题内容: 我正在尝试使用EF5从bcontext.Database.SqlQuery执行存储过程。 它抛出一个错误 如果customerNumber是staff,则SP返回,否则返回行。 如何处理? 问题答案: 由于使用的是命名参数,因此必须为要传递的参数指定匹配名称。

  • 错误消息: [Microsoft][ODBC驱动程序for Oracle][Oracle]ORA-06550:第1行,第7列:PLS-00201:标识符STORED_PROCEDURE必须声明ORA-06550:第1行,第7列:PL/SQL:语句被忽略

  • 这是我成功的存储过程 这是首先生成表的调用 最初,我试图用一些预定义的参数调用存储过程。 这导致错误“PLS-00201:标识符'B100'必须声明” 我是PL/SQL的新手,很难解决这个问题。我尝试添加DECLARE语句 这仍然会导致错误“PLS-00201:必须声明标识符‘B100’”,但它表示“PL/SQL:忽略语句”,然后表示“PLS-00201:必须声明标识符‘Steve’” 进一步挖掘

  • 作为标题,我正在Oracle上编写一些存储过程,首先我检查了版本 有结果 ... 并尝试NVL2与常规SQL查询 结果似乎是对的 ... 所以我确认11g确实支持NLV2功能,我现在可以开始编写我的存储过程,如下所示: Oracle告诉我它编译有错误,即 PLS-00201:必须声明标识符“NVL2” 为什么函数在常规查询中工作,但在存储过程中变得未声明?

  • 我试着按照步骤在Toad中运行以下代码 1。初始化变量2并为其分配日期。打印出来确认3。然后使用变量检查日期范围的my when子句<你知道我做错了什么吗? --检查我的time子句 --检查:this_day之间(2018年4月1日至2018年12月1日) ORA-06550:第1行,第21列:PLS-00201:标识符“01-JAN-2018”必须声明ORA-06550:第1行,第7列:PL/