【问题标题】:Table Valued Must declare the scalar variable表值必须声明标量变量
【发布时间】:2018-02-14 05:12:02
【问题描述】:

我有一个接受表值参数的存储过程。

下面是代码:

ALTER PROCEDURE [dbo].[ConsolidateInspection]
    @TblConsolidation DTProductCodePO READONLY
AS
BEGIN
    BEGIN TRANSACTION
        DECLARE @CurrentFormNo AS BIGINT = 0

        INSERT INTO [InspectionDB].[dbo].[FormHeader] 
                      (PONumber, POSuffix, [Productcode], [Stratum], [SpecNumber], [Engineer],
                       [ProductManager], [CountryCode], [SupplierCode], [Supplier],
                       [QTY], [EAGTIN], [INGTIN], [OUGTIN], [InspectionType], [InspectorName])
            SELECT 
                @CurrentFormNo = P.FormNo   
            FROM 
                FormHeader P 
            INNER JOIN 
               @TblConsolidation T ON P.PONumber = T.PO 
                                   AND P.POSuffix = T.POSuffix 
                                   AND P.Productcode = T.ProductCode
                                   AND P.CountryCode = T.CountryCode
           ORDER BY 
               PO, P.POSuffix, P.Productcode


        COMMIT TRANSACTION
    END

我正在尝试执行上面的存储过程:

exec ConsolidateInspection @TblConsolidation dbo.Temp

dbo.Temp 是具有相同属性的表的名称

我试过了

exec ConsolidateInspection @TblConsolidation Select * from Temp

它抛出一个错误说

必须声明标量变量“@TblConsolidation”

有什么帮助吗?

【问题讨论】:

  • 在调用代码中声明变量(必须是正确的类型!)。选择INTO [table-valued] 变量。向 SPROC 提供just 变量名。
  • FWIW:按名称提供参数,=is required between the name and value:exec MySPROC @a = 'hello', @b = 'world'。但是,请参见上文。
  • 没用..还是一样
  • 第二条评论说为什么你得到错误(如果使用exec ConsolidateInspection @TblConsolidation = dbo.Temp将是一个不同的错误不是“还是一样”)。第一条评论说明了在这种情况下如何实际上调用 SP。查看链接:value 受限。就允许的内容而言,语法[相对]定义良好,如果不是有时很尴尬的话。
  • 投票关闭,因为“报告的错误”和“实际/执行的 SQL”不断变化。一次解决一个问题。如果 SSMS / SQL Server 说未定义变量,则未定义该变量。修复它,然后继续。注意 cmets(避免不相关的语法错误)和现有答案等。

标签: sql sql-server stored-procedures table-valued-parameters


【解决方案1】:

dbo.Temp 与 DTProductCodePO 不同! DTProductCodePO 是一种表类型,您应该定义一个变量然后填充它,然后将其作为参数使用:

Declare @Tbl DTProductCodePO

Insert into @Tbl(your fields here ...) 
SELECT ...SAME FIELD HERE... from dbo.Temp

exec ConsolidateInspection @Tbl

【讨论】:

  • 我要执行“ConsolidateInspection”的 SP 没有被执行。
  • 无论如何我没有使用任何其他表,它只是为了分配值并查看它的工作原理,我创建了临时表。我需要创建表吗?我不能在“ConsolidateInspection”中直接使用电视吗?
  • 我的问题是我无法将数据发送到@TblConsolidation
  • 您有一个名为 DTProductCodePO 的表类型。您不能将临时寺庙创建为存储过程参数。您应该创建一个 DTProductCodePO 变量,然后填充它,然后将其用作参数。你的代码有什么问题?
  • "ConsolidateInspection" 是我想要执行的 SP。执行我确实 Declare @Tbl DTProductCodePO INSERT INTO @Tbl Select * from Temp Select * from Temp exec ConsolidateInspection @ Tbl 但它没有执行 ConsolidateInspection
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
相关资源
最近更新 更多