在具有变量 table 名称的存储过程中使用参数化查询的值
Using value from a paramterised query within a stored procedure that has a variable table name
我有一个存储过程,调用它来为特定客户帐户建立序列号。一个简单的 table 存储所有客户端的最后发布值,SP 将仅采用 SupplyChainID 参数以及需要多少个数字。
GetItemIDs
所以 SupplyChainID 12345 可能有 5 作为其最后发布的编号,所以 运行ning
GetItemIDs 12345,200
将return 5 然后将值设置为 205 以供下次使用
所以当前的 SP 会做这样的事情,因为它必须检查它是否不超过 99,999,999。 (如果结束则返回 0)
IF (SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID) + @DocumentCount > 99999999
BEGIN
SELECT 0
UPDATE dbo.ItemIDGeneration SET EIBItemID = @DocumentCount,
LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
ELSE
BEGIN
SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UPDATE dbo.ItemIDGeneration SET EIBItemID = EIBItemID + @DocumentCount,
LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
我需要添加的是检查另一个 table 以查看它是否具有更高的值,在这种情况下使用该值而不是 ItemGeneration table[的最后发布的数字] =15=]
像这样:
SELECT @HI_ID = MAX(EIBItemID) from
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UNION ALL
SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM dbo.SupplyChainID_'+ @tablename) as bigint
IF (@HI_ID) + @DocumentCount > 99999999
BEGIN
SELECT 0
UPDATE dbo.ItemIDGeneration SET EIBItemID=@DocumentCount,LastIssuedDate = getdate() WHERE SupplyChainID = @SCID END
ELSE
BEGIN
SELECT @HI_ID--EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UPDATE dbo.ItemIDGeneration SET EIBItemID = @HI_ID +@DocumentCount,LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
如您所见,table 与 table 名称的一部分具有相同的 SupplyChainID,因此我知道我需要将其作为查询的一部分传入并执行,但我可以'无法使以下工作正常工作
SET @tablename = 'dbo.SupplyChain_'+@SCID
SET @tablequery = N'SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM ' + @tablename
execute @tableID = sp_executesql @tablequery
SELECT @HI_ID = MAX(EIBItemID) from
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
union all
SELECT @tableID) as bigint
IF (@HI_ID) + @DocumentCount > 99999999
该过程没有错误,但我认为我的语法有问题,因为我 运行 以下
declare @return int
exec @return = GetItemIDs 8001377,20
select @return as result
我看到 EIBItemID returned 是 dbo.SupplyChain_xxxxx table 的正确结果,但是 sp 末尾的 return 值是基于ItemIDGeneration table (returns 200).
我认为调用 exec 时显然 return 得到了正确的结果,但在 @tableid
中存储了 0
您可以试试这个来获取值:
DECLARE @SCID INT = 1
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10))
DECLARE @TableID BIGINT
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID), 0) FROM ' + @TableName
EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT
PRINT @TableID
感谢所有的回答,我根据 Alex 的建议做了一些小调整
DECLARE @HI_ID as bigint
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10))
DECLARE @TableID BIGINT
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID),0) FROM ' + @TableName
EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT
SELECT @TableID As EIBItemID
我有一个存储过程,调用它来为特定客户帐户建立序列号。一个简单的 table 存储所有客户端的最后发布值,SP 将仅采用 SupplyChainID 参数以及需要多少个数字。
GetItemIDs
所以 SupplyChainID 12345 可能有 5 作为其最后发布的编号,所以 运行ning
GetItemIDs 12345,200
将return 5 然后将值设置为 205 以供下次使用
所以当前的 SP 会做这样的事情,因为它必须检查它是否不超过 99,999,999。 (如果结束则返回 0)
IF (SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID) + @DocumentCount > 99999999
BEGIN
SELECT 0
UPDATE dbo.ItemIDGeneration SET EIBItemID = @DocumentCount,
LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
ELSE
BEGIN
SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UPDATE dbo.ItemIDGeneration SET EIBItemID = EIBItemID + @DocumentCount,
LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
我需要添加的是检查另一个 table 以查看它是否具有更高的值,在这种情况下使用该值而不是 ItemGeneration table[的最后发布的数字] =15=]
像这样:
SELECT @HI_ID = MAX(EIBItemID) from
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UNION ALL
SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM dbo.SupplyChainID_'+ @tablename) as bigint
IF (@HI_ID) + @DocumentCount > 99999999
BEGIN
SELECT 0
UPDATE dbo.ItemIDGeneration SET EIBItemID=@DocumentCount,LastIssuedDate = getdate() WHERE SupplyChainID = @SCID END
ELSE
BEGIN
SELECT @HI_ID--EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UPDATE dbo.ItemIDGeneration SET EIBItemID = @HI_ID +@DocumentCount,LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
如您所见,table 与 table 名称的一部分具有相同的 SupplyChainID,因此我知道我需要将其作为查询的一部分传入并执行,但我可以'无法使以下工作正常工作
SET @tablename = 'dbo.SupplyChain_'+@SCID
SET @tablequery = N'SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM ' + @tablename
execute @tableID = sp_executesql @tablequery
SELECT @HI_ID = MAX(EIBItemID) from
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
union all
SELECT @tableID) as bigint
IF (@HI_ID) + @DocumentCount > 99999999
该过程没有错误,但我认为我的语法有问题,因为我 运行 以下
declare @return int
exec @return = GetItemIDs 8001377,20
select @return as result
我看到 EIBItemID returned 是 dbo.SupplyChain_xxxxx table 的正确结果,但是 sp 末尾的 return 值是基于ItemIDGeneration table (returns 200).
我认为调用 exec 时显然 return 得到了正确的结果,但在 @tableid
中存储了 0您可以试试这个来获取值:
DECLARE @SCID INT = 1
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10))
DECLARE @TableID BIGINT
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID), 0) FROM ' + @TableName
EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT
PRINT @TableID
感谢所有的回答,我根据 Alex 的建议做了一些小调整
DECLARE @HI_ID as bigint
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10))
DECLARE @TableID BIGINT
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID),0) FROM ' + @TableName
EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT
SELECT @TableID As EIBItemID