У меня есть хранимая процедура, которая вызывается для установки порядковых номеров для определенной учетной записи клиента. Простая таблица хранит последнее выпущенное значение для всех клиентов, и SP будет просто принимать параметр SupplyChainID и сколько номеров требуется.Использование значения из параметризованного запроса в хранимой процедуре с именем таблицы переменных
GetItemIDs
Так SupplyChainID 12345 может иметь 5 в качестве последнего выданного числа, поэтому запуск
GetItemIDs 12345.200
будет возвращать 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
Что мне нужно, чтобы добавить это проверка другой таблицы, чтобы увидеть, если это имеет большее значение, и в этом случае использовать что один вместо последнего выданного числа из таблицы ItemGeneration
Что-то вроде этого:
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 [email protected],LastIssuedDate = getdate() WHERE SupplyChainID = @SCID END
ELSE
BEGIN
SELECT @HI_ID--EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID
UPDATE dbo.ItemIDGeneration SET EIBItemID = @HI_ID [email protected],LastIssuedDate = getdate() WHERE SupplyChainID = @SCID
END
Как вы можете видеть, что таблица имеет тот же SupplyChainID как часть имени таблицы, так что я знаю, что нужно передать его как часть запроса и выполнить его, но я не могу получить следующее:
SET @tablename = 'dbo.SupplyChain_'[email protected]
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 вернулся как правильный результат из таблицы dbo.SupplyChain_xxxxx, но возвращаемое значение из конца sp - это ответ на основе таблицы ItemIDGeneration (возвращает 200).
Я думаю, что это явно возвращает правильный результат, когда ехес называется, но хранение 0 в @tableid
Благодарим за это, небольшая настройка и работает – Colster