【发布时间】: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