Вам может не потребоваться использование пакетов, и в этом случае вы можете заставить свои переменные выживать в течение очень долгого времени. Я не уверен, что это лучшая практика, но, например, объявление функции обычно должно быть единственным оператором в пакете, например так:
Declare @batch_scope_var INT
GO --This is required
CREATE FUNCTION dbo.Half(@function_scope_var int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
RETURN @function_scope_var/2
END
GO --This is required
SET @batch_scope_var = 4 --Bugger, this is now out of scope and won't execute!
print dbo.Half(@batch_scope_var)
GO
Однако вы можете переписать это, используя * sp_executesql * и избегать всех этих пакетов, например:
Declare @batch_scope_var INT
execute dbo.sp_executesql @statement = N'
CREATE FUNCTION dbo.Half(@function_scope_var int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
RETURN @function_scope_var/2
END
'
SET @batch_scope_var = 4
print dbo.Half(@batch_scope_var)
GO
Это действительно зависит от сложности вашего скрипта, от того, хотите ли вы сделать это, поскольку он может стать немного запутанным, и вы потеряете подсветку синтаксиса, как только все будет в гигантской строке:)