2009-06-01 4 views
52

이동 중에도 변수를 유지할 수 있습니까? 이동 중에 변수를 지속시키는 방법이 있습니까?

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') 

은 '사용 @bob'라인이 SO 질문을 참조하십시오.

+0

왜 당신을 테이블 이름을 DB 이름으로 한정해야합니까?비슷한 질문을하기 전에이 질문을 한 것 같습니다. – shahkalpesh

+0

그런 식으로 테이블 이름을 데이터베이스 이름으로 한정 할 수있는 방법이 없습니다. 이전에 USE 문에 변수를 사용하는 것에 관한 질문을 통해 동적 SQL에서 모든 것을 처리해야한다는 것을 알았습니다. –

+0

실제 스크립트는 4 개의 다른 데이터베이스를 통합합니다. dbName1, dbName2, dbName3 및 dbName4를 찾고 바꿀 지침을 주석으로 달았습니다. 나는 클라이언트가 단지 4 개의 변수를 설정하는 것이 오류가 적어 질 것이라고 생각했다. – NitroxDM

답변

25

go 명령은 코드를 별도의 배치로 분할하는 데 사용됩니다. 그것이 당신이 원하는 것과 정확히 같다면, 그것을 사용해야 만합니다. 그러나 이것은 배치가 실제로 분리되어 있다는 것을 의미하며, 배치간에 변수를 공유 할 수 없습니다.

해결책은 간단합니다. go 문을 제거하면 해당 코드에 필요하지 않습니다.

보조 참고 : use 문에서 변수를 사용할 수 없으며 데이터베이스의 이름이어야합니다.

+0

일부 SQL 문은 블록의 첫 번째 문 (GO 문 사이의 영역)이어야합니다. 예를 들어, CREATE PROCEDURE 또는 CREATE FUNCTION은 스크립트의 맨 위에 또는 GO 문 바로 뒤에 오는 다른 명령문보다 먼저 발생해야합니다 (주 : 공백 및 주석은이 명령문 앞에 허용됩니다). 다른 명령문 뒤에 이러한 명령문을 사용해야하는 스크립트를 실행하는 경우 GO 명령문이 필요합니다. 그러나 대부분의 경우 GO 문을 제거 할 수 있다는 데 동의해야합니다. – Zarepheth

+0

@ Zarepheth : 좋은 지적입니다. 이 특정 코드에는 필요하지 않지만 어떤 경우에는 필요할 수도 있다는 것을 아는 것이 유용합니다. – Guffa

+1

왜 downvote? 당신이 잘못되었다고 생각하는 것이 무엇인지 설명하지 않는다면 대답을 향상시킬 수 없습니다. – Guffa

1

확실하지,이

declare @s varchar(50) 
set @s='Northwind' 

declare @t nvarchar(100) 
set @t = 'select * from ' + @s + '.[dbo].[Customers]' 

execute sp_executesql @t
84

임시 테이블을 사용하여 도움이된다면 : 단지에 대한 확인이 (100 %와 보안 위험을 인식

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 
+10

위대한 답변을 ... 당신은 실제로 문제를 해결하기보다는 묻은 질문에 답했습니다. –

2

당신이 동적 SQL을 사용할 수를 정확한 syntex)

선언 @bob의 NVARCHAR (50)

declare @sql nvarchar(max) 
set @bob='SweetDB' 
set @sql = 'Use ' + @bob 

execute sp_executesql @sql 
+0

나는 이것이 낡은 대답 인 것을 알고 있지만, 수사에 잘 올 수 있습니다. 명령문이 실행되고 제어가 호출 루틴에 리턴되면 동적 "use"문을 실행하기 전에 있던 데이터베이스를 계속 사용하게됩니다. 따라서 현재 데이터베이스를 실제로 변경하는 방법으로 혼동해서는 안됩니다. – Storm

12

나는 원래뿐만 아니라하고 싶었던 일을 할 수있는의 추가 혜택을 가지고이 질문에 Global Variables with GO

에서 this 대답을 선호한다.

SQLCMD 모드 (쿼리 -> SQLCMD 아래)를 켜거나 모든 쿼리 창 (도구 -> 옵션, 쿼리 결과 -> 기본적으로 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 
+0

SQLCMD 모드에서 쿼리 출력을 다른 파일 (: out filename)로 리디렉션하고 GO 명령을 실행해야하는 파일로 출력을 플러시하려면 setvar 구문을 사용하여 해당 상황의 일반 변수를 바꿔야합니다. 일을 일괄 적으로 분할하도록 강요 받았다. – Anssssss

0

당신은 당신이 할 수있는 SQL Server를 사용하는 경우와 같은 전체 스크립트를 설치 전역 변수 :

:setvar sourceDB "lalalallalal" 

과 같이 스크립트에서 나중에 사용

$(sourceDB) 

확인 SQLCMD 모드가 서버 Managment를 스투에 켜져, 당신은 상단 메뉴를 통해 쿼리를 클릭 한 다음에 SQLCMD 모드를 전환하는 것이 할 수 있습니다. 주제에

더는 여기에서 찾을 수 있습니다 : ... MS Documentation

1

임시 테이블 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 

그것은 꽤 아니지만, 작동

관련 문제