2016-12-20 9 views
0

У меня есть хранимая процедура, которая вызывается для установки порядковых номеров для определенной учетной записи клиента. Простая таблица хранит последнее выпущенное значение для всех клиентов, и 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

ответ

0

Спасибо всем, что ответили, я использовал предложение Алекс с небольшой настройкой

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 
1

Вы можете попробовать это, чтобы получить значение:

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 
+0

Благодарим за это, небольшая настройка и работает – Colster