이동 중에도 변수를 유지할 수 있는 방법이 있습니까?
이동 중에도 변수를 유지할 수 있는 방법이 있습니까?
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 |