이동 중에도 변수를 유지할 수 있는 방법이 있습니까?
이동 중에도 변수를 유지할 수 있는 방법이 있습니까?
Declare @bob as varchar(50);
Set @bob = 'SweetDB';
GO
USE @bob --- see note below
GO
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2')
'USE @bob' 행은 이 SO 질문을 참조하십시오.
임시 테이블 사용:
CREATE TABLE #variables
(
VarName VARCHAR(20) PRIMARY KEY,
Value VARCHAR(255)
)
GO
Insert into #variables Select 'Bob', 'SweetDB'
GO
Select Value From #variables Where VarName = 'Bob'
GO
DROP TABLE #variables
go
그go
명령어는 코드를 다른 배치로 분할하기 위해 사용합니다.이것이 정확히 필요한 작업이라면 사용해야 하지만, 실제로는 배치가 분리되어 있고 변수를 공유할 수 없다는 것을 의미합니다.
이 경우 솔루션은 간단합니다.go
이 코드에는 필요 없습니다.
사이드 노트:변수 사용 안 함use
데이터베이스 이름이어야 합니다.
GO를 사용하는 글로벌 변수에서 이 답변을 선호합니다.
원래 하고 싶었던 일도 할 수 있다는 장점이 있습니다.
주의: SQLCMD 모드를 켜거나([Query]-> [SQLCMD]에서) 모든 쿼리 창에서 기본값으로 켜야 합니다([Tools]-> [Options ]> [ Query Results ]-> [Default ]의 경우 SQLCMD 모드로 새 쿼리를 엽니다).
그 후, 다음의 타입의 코드를 사용할 수 있습니다(Oscar E.Fraxedas Tormo의 같은 대답에서 완전히 발췌).
--Declare the variable
:setvar MYDATABASE master
--Use the variable
USE $(MYDATABASE);
SELECT * FROM [dbo].[refresh_indexes]
GO
--Use again after a GO
SELECT * from $(MYDATABASE).[dbo].[refresh_indexes];
GO
SQL Server를 사용하는 경우 다음과 같은 전체 스크립트에 대한 글로벌 변수를 설정할 수 있습니다.
:setvar sourceDB "lalalallalal"
스크립트에서 나중에 다음과 같이 사용합니다.
$(sourceDB)
Server Management Studi에서 SQLCMD 모드가 켜져 있는지 확인합니다. 상단 메뉴에서 [Query]를 클릭하여 SQLCMD 모드를 켤 수 있습니다.
토픽의 상세한 것에 대하여는, MS 의 메뉴얼을 참조해 주세요.
임시 테이블은 GO 문 위에 유지되므로...
SELECT 'value1' as variable1, 'mydatabasename' as DbName INTO #TMP
-- get a variable from the temp table
DECLARE @dbName VARCHAR(10) = (select top 1 #TMP.DbName from #TMP)
EXEC ('USE ' + @dbName)
GO
-- get another variable from the temp table
DECLARE @value1 VARCHAR(10) = (select top 1 #TMP.variable1 from #TMP)
DROP TABLE #TMP
예쁘지는 않지만 효과가 있다
임시 테이블에 저장/로드하는 자체 저장 프로시저를 만듭니다.
MyVariableSave -- Saves variable to temporary table.
MyVariableLoad -- Loads variable from temporary table.
다음으로 다음을 사용할 수 있습니다.
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)))
출력:
Test stored procedures for load/save of variables across GO statements:
- Set @MyVariable = 42
- GO statement resets all variables
- Get @MyVariable = 42
다음의 것도 사용할 수 있습니다.
exec dbo.MyVariableList -- Lists all variables in the temporary table.
exec dbo.MyVariableDeleteAll -- Deletes all variables in the temporary table.
출력exec dbo.MyVariableList
:
Name Value
test 42
모든 변수를 표에 나열할 수 있는 것은 실제로 매우 유용한 것으로 나타났습니다.따라서 나중에 변수를 로드하지 않더라도 모든 것을 한 곳에서 볼 수 있는 디버깅 용도로 적합합니다.
이 명령어에서는 다음 명령어가 포함된 임시 테이블을 사용합니다.##
프리픽스이므로 GO 스테이트먼트에서 살아남기에 충분합니다.이는 단일 스크립트 내에서 사용하는 것을 목적으로 합니다.
저장 프로시저:
-- Stored procedure to save a variable to a temp table.
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 ##VariableLoadSave
CREATE TABLE ##VariableLoadSave
(
Name varchar(255),
Value varchar(MAX)
)
END
UPDATE ##VariableLoadSave SET Value=@Value WHERE Name=@Name
IF @@ROWCOUNT = 0
INSERT INTO ##VariableLoadSave SELECT @Name, @Value
END
GO
-- Stored procedure to load a variable from a temp table.
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 ##VariableLoadSave WHERE Name=@Name)
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 ##VariableLoadSave
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
-- Stored procedure to list all saved variables.
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 ##VariableLoadSave
ORDER BY Name
END
END
GO
-- Stored procedure to delete all saved variables.
CREATE OR ALTER PROCEDURE MyVariableDeleteAll
WITH EXECUTE AS CALLER
AS
BEGIN
DROP TABLE IF EXISTS ##VariableLoadSave
CREATE TABLE ##VariableLoadSave
(
Name varchar(255),
Value varchar(MAX)
)
END
2진수 yes/no만 필요한 경우(열이 존재하는 경우 등)에는SET NOEXEC ON
스테이트먼트의 실행을 디세블로 합니다. SET NOEXEC ON
는, GO(배치 전체)에 걸쳐 동작합니다.단, EXEC의 전원을 다시 켜야 합니다.SET NOEXEC OFF
스크립트 끝에 있습니다.
IF COL_LENGTH('StuffTable', 'EnableGA') IS NOT NULL
SET NOEXEC ON -- script will not do anything when column already exists
ALTER TABLE dbo.StuffTable ADD EnableGA BIT NOT NULL CONSTRAINT DF_StuffTable_EnableGA DEFAULT(0)
ALTER TABLE dbo.StuffTable SET (LOCK_ESCALATION = TABLE)
GO
UPDATE dbo.StuffTable SET EnableGA = 1 WHERE StuffUrl IS NOT NULL
GO
SET NOEXEC OFF
이렇게 하면 문이 컴파일되지만 실행되지는 않습니다.따라서 존재하지 않는 스키마를 참조하면 여전히 "컴파일 오류"가 발생합니다.따라서 두 번째 실행(현재 실행 중인 작업)에서는 스크립트를 "끄기"하지만 첫 번째 실행에서는 스크립트의 일부를 끄지 않습니다. 왜냐하면 아직 존재하지 않는 열이나 테이블을 참조할 경우 컴파일 오류가 발생하기 때문입니다.
NOEXEC를 사용할 수 있습니다.다음 절차를 따릅니다.
테이블 작성
#temp_procedure_version(procedure_version varchar(5),pointer varchar(20))
버전 및 포인터를 임시 테이블 시 이 블 로 전 전 한 인 입 삽 합 다 니 insert into versions and포대 table a procedure를터 the에 pointer버#temp_procedure_version
--syslog procedure_version 포인터
insert into 에 삽입하다.temp_procedure_version
값(1.0, 첫 번째 버전' (0, ' 째 전 번)'버 values version,',)
insert into 에 삽입하다.temp_procedure_version
값(.2.0, 최종 버전' (2.0, ' 전) 버'종 version, values)
그런 다음 프로시저 버전을 가져옵니다.다음 문장에서와 같이 where condition을 사용할 수 있습니다.
택 한 select다?@ProcedureVersion=ProcedureVersion
부에서#temp_procedure_version
어 어디 있죠?pointer='first version'
IF (@ProcedureVersion='1.0')
BEGIN
SET NOEXEC OFF --code execution on
END
ELSE
BEGIN
SET NOEXEC ON --code execution off
END
-- 여기에 프로시저 버전 1.0을 삽입합니다.
프로시저 버전 1.0을 만듭니다.
SET NOEXEC OFF -- execution is ON
택 한 select다?@ProcedureVersion=ProcedureVersion
부에서#temp_procedure_version
포인터=의 최종 버전 인 터 ' 전 ' 버 ' 종 where = 기)
IF (@ProcedureVersion='2.0')
BEGIN
SET NOEXEC OFF --code execution on
END
ELSE
BEGIN
SET NOEXEC ON --code execution off
END
프로시저 버전 2.0을 만듭니다.
SET NOEXEC OFF -- execution is ON
-- 임시 테이블을 드롭합니다.
테이블 롭 이 drop블 table테드 drop?#temp_procedure_version
언급URL : https://stackoverflow.com/questions/937336/is-there-a-way-to-persist-a-variable-across-a-go
'programing' 카테고리의 다른 글
목록에 개체가 이미 있는지 확인하는 방법 (0) | 2023.04.15 |
---|---|
switch 문을 문자열에 적용할 수 없는 이유는 무엇입니까? (0) | 2023.04.15 |
"변경 내용을 커밋하거나 병합하기 전에 저장하십시오"라는 git을 해결하려면 어떻게 해야 합니까? (0) | 2023.04.15 |
jQuery가 요청 본문에 유효한 json을 게시합니다. (0) | 2023.04.05 |
네이티브와 안드로이드 대응 (0) | 2023.04.05 |