Tạo các thủ tục được lưu trữ của riêng bạn để lưu / tải vào một bảng tạm thời.
MyVariableSave
MyVariableLoad
Sau đó, bạn có thể sử dụng cái này:
print('Test stored procedures for load/save of variables across GO statements:')
declare @MyVariable int = 42
exec dbo.MyVariableSave @Name = 'test', @Value=@MyVariable
print(' - Set @MyVariable = ' + CAST(@MyVariable AS VARCHAR(100)))
print(' - GO statement resets all variables')
GO -- This resets all variables including @MyVariable
declare @MyVariable int
exec dbo.MyVariableLoad 'test', @MyVariable output
print(' - Get @MyVariable = ' + CAST(@MyVariable AS VARCHAR(100)))
Đầu ra:
Test stored procedures for load/save of variables across GO statements:
- Set @MyVariable = 42
- GO statement resets all variables
- Get @MyVariable = 42
Bạn cũng có thể sử dụng:
exec dbo.MyVariableList
exec dbo.MyVariableDeleteAll
Đầu ra của exec dbo.MyVariableList
:
Name Value
test 42
Nó chỉ ra rằng có thể liệt kê tất cả các biến trong một bảng thực sự khá hữu ích. Vì vậy, ngay cả khi bạn không tải một biến sau đó, nó rất tốt cho mục đích gỡ lỗi để xem mọi thứ ở một nơi.
Điều này sử dụng một bảng tạm thời có ##
tiền tố, vì vậy nó chỉ đủ để tồn tại một câu lệnh GO. Nó được thiết kế để sử dụng trong một tập lệnh duy nhất.
Và các thủ tục được lưu trữ:
CREATE OR ALTER PROCEDURE MyVariableSave
@Name varchar(255),
@Value varchar(MAX)
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON
IF NOT EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
BEGIN
DROP TABLE IF EXISTS
CREATE TABLE
(
Name varchar(255),
Value varchar(MAX)
)
END
UPDATE
IF @@ROWCOUNT = 0
INSERT INTO
END
GO
CREATE OR ALTER PROCEDURE MyVariableLoad
@Name varchar(255),
@Value varchar(MAX) OUT
WITH EXECUTE AS CALLER
AS
BEGIN
IF EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
BEGIN
IF NOT EXISTS(SELECT TOP 1 * FROM
BEGIN
declare @ErrorMessage1 as varchar(200) = 'Error: cannot find saved variable to load: ' + @Name
raiserror(@ErrorMessage1, 20, -1) with log
END
SELECT @Value=CAST(Value AS varchar(MAX)) FROM
WHERE Name=@Name
END
ELSE
BEGIN
declare @ErrorMessage2 as varchar(200) = 'Error: cannot find saved variable to load: ' + @Name
raiserror(@ErrorMessage2, 20, -1) with log
END
END
GO
CREATE OR ALTER PROCEDURE MyVariableList
WITH EXECUTE AS CALLER
AS
BEGIN
IF EXISTS (select TOP 1 * from tempdb.sys.objects where name = '##VariableLoadSave')
BEGIN
SELECT * FROM
ORDER BY Name
END
END
GO
CREATE OR ALTER PROCEDURE MyVariableDeleteAll
WITH EXECUTE AS CALLER
AS
BEGIN
DROP TABLE IF EXISTS
CREATE TABLE
(
Name varchar(255),
Value varchar(MAX)
)
END