Непонятно, почему хранимый процесс зависит от вашего глобала в вашем примере набора из двух пакетов.Я вижу две основные возможности: либо SP имеет зависимость от глобального в момент создания (т. Е. Генерация кода - вариант 1), либо SP имеет зависимость во время выполнения от глобального (то есть вы должны выбирать между параметризацией - случай 2) илиСамоконфигурирование - Case3).
В случае зависимости во время выполнения, то, получено ли это из какого-либо места за пределами SP и передано в качестве параметра или внутри SP непосредственно, является основным проектным решением.Выбор того, когда передавать данные в качестве параметра, а когда извлекать данные из таблиц, не совсем точен, все зависит от всех реальных случаев использования в системе.
Случай 1 - Генерация кода:
DECLARE @SomeVariable int
SET @SomeVariable = 'VALUE'
FROM someTable
--do stuff with @SomeVariable
GO
DECLARE @sp as varchar(MAX)
SET @sp = '
CREATE PROCEDURE myProcedure -- I would actually name this myProcedure_ + CONVERT(varchar, @SomeVariable), since each proc generated might function differently
(
@MyParameter
)
AS
SET NOCOUNT ON
DECLARE @SomeVariable AS int -- This is going to be an initialized local copy of the global at time of SP creation
SET @SomeVariable = ' + CONVERT(varchar, @SomeVariable) + '
--Do something
--Do something using @SomeVariable
SET NOCOUNT OFF
RETURN 0
'
EXEC(@sp) -- create the procedure dynamically
Executing the producedure normally as EXEC myProcedure or EXEC myProcedure_1, etc.
Случай 2 - Параметризация:
DECLARE @SomeVariable int
SET @SomeVariable = 'VALUE'
FROM someTable
--do stuff with @SomeVariable
GO
CREATE PROCEDURE myProcedure
(
@MyParameter
,@SomeVariable int
)
AS
SET NOCOUNT ON
--Do something
--Do something using @SomeVariable
SET NOCOUNT OFF
RETURN 0
GO
Теперь, когда вызывается myProcedure
, ему всегда должен передаваться параметр @SomeVariable
.Это рекомендуется, когда вы регулярно вызываете одного и того же SP с другой параметризацией
Случай 3 - Конфигурация:
DECLARE @SomeVariable int
SET @SomeVariable = 'VALUE'
FROM someTable
--do stuff with @SomeVariable
GO
CREATE PROCEDURE myProcedure
(
@MyParameter
)
AS
SET NOCOUNT ON
--Do something
DECLARE @SomeVariable int
SET @SomeVariable = 'VALUE'
FROM someTable
SET NOCOUNT OFF
RETURN 0
GO
Теперь, когда вы выполняете EXEC myProcedure, вам нужно убедиться, что конфигурация былаустановить в таблице.Этот сценарий рекомендуется для медленно меняющихся вариантов конфигурации.В этом случае вы можете обернуть инициализацию @SomeVariable
в UDF со скалярным значением, чтобы каждый раз, когда одна и та же конфигурация использовалась в разных SP, все они вызывали один и тот же UDF, что освобождает вас от необходимости изменять соглашения в таблице конфигурации.(в любом случае, вы не предоставляете своим пользователям разрешение SELECT для своих таблиц, верно?), и если UDF необходимо начать варьироваться в зависимости от пользователя или аналогичного, у вас теперь есть контрольная точка, которая обеспечивает согласованность, разрешения и соглашения о вызовах интерфейса:
DECLARE @SomeVariable int
SET @SomeVariable = dbo.udf_Global(username, session, etc.)
--do stuff with @SomeVariable
GO
CREATE PROCEDURE myProcedure
(
@MyParameter
)
AS
SET NOCOUNT ON
--Do something
DECLARE @SomeVariable int
SET @SomeVariable = dbo.udf_Global(username, session, etc.)
SET NOCOUNT OFF
RETURN 0
GO