Непонятно, почему хранимая процедура имеет зависимость от вашего глобального в вашем примере набора из двух партий. Я вижу две основные возможности: либо 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, так что любые времена эта же конфигурация используется в различных ЗЛ, все они будут вызов через тот же 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
О мальчик, что катится мир. ? :( – ChaosPandion
Что вы делаете, что требует глобального переменного Если бы мы знали больше, мы могли бы предоставить альтернативные –
Просто чтобы быть ясно, что вы ищете глобальные переменный или глобальную константу – JohnFx