복붙노트

[SQL] 어떻게 .. SQL 서버에서 전역 변수를 선언하려면?

SQL

어떻게 .. SQL 서버에서 전역 변수를 선언하려면?

나는 다른 DB와 다른 쿼리에 대해 동일한 값을 사용하려면

처럼

DECLARE @GLOBAL_VAR_1 INT = Value_1

DECLARE @GLOBAL_VAR_2 INT = Value_2

USE "DB_1"
GO
SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1 

AND "COL_2" = @GLOBAL_VAR_2

USE "DB_2"
GO

SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2 

그러나 그 오류를주는.

하나는 그것을 할 수있는 방법 ...을 제안 할 수 있습니까?

해결법

  1. ==============================

    1.거래-SQL에서 전역 변수를 선언 할 수있는 방법은 없습니다. 당신이 당신의 변수를 원하는 모든 경우, 하나의 스크립트의 배치를 통해 액세스 할 수 있습니다를 들어, SQLCMD 도구 또는 SSMS의 SQLCMD 모드를 사용하고 같은 해당 도구 / 모드 별 변수를 정의 할 수 있습니다 :

    거래-SQL에서 전역 변수를 선언 할 수있는 방법은 없습니다. 당신이 당신의 변수를 원하는 모든 경우, 하나의 스크립트의 배치를 통해 액세스 할 수 있습니다를 들어, SQLCMD 도구 또는 SSMS의 SQLCMD 모드를 사용하고 같은 해당 도구 / 모드 별 변수를 정의 할 수 있습니다 :

    :setvar myvar 10
    

    다음과 같이 사용할 :

    $(myvar)
    

    SSMS SQLCMD 모드를 사용하려면 :

  2. ==============================

    2.당신은 SQLServer에 글로벌 변수를 선언 할 수 없습니다.

    당신은 SQLServer에 글로벌 변수를 선언 할 수 없습니다.

    당신이 Management Studio를 사용하는 경우 @Lanorkin 지적처럼 당신은 SQLCMD 모드를 사용할 수 있습니다.

    그렇지 않으면 세션 및 연결 중에 볼 수있는 하나의 변수를 저장하는 데 CONTEXT_INFO를 사용할 수 있지만, 그 후 사라질 것입니다.

    만 진정한 글로벌 (## yourTableName 이름) 글로벌 임시 테이블을 만들고, 거기 변수를 저장하는 것입니다 만, 모든 연결이 닫힐 때 그 또한 사라집니다.

  3. ==============================

    3.당신은 글로벌 테이블을 시도 할 수 있습니다 :

    당신은 글로벌 테이블을 시도 할 수 있습니다 :

    create table ##global_var
                (var1 int
                ,var2 int)
    
    USE "DB_1"
    GO
    SELECT * FROM "TABLE" WHERE "COL_!" = (select var1 from ##global_var) 
    
    AND "COL_2" = @GLOBAL_VAR_2
    
    USE "DB_2"
    GO
    
    SELECT * FROM "TABLE" WHERE "COL_!" = (select var2 from ##global_var) 
    
  4. ==============================

    4.SQL 서버 2016에서 세션 정보를 공유 할 수있는 새로운 방법을 시작하는 SESSION_CONTEXT 및 sp_set_session_context를 통해 소개된다.

    SQL 서버 2016에서 세션 정보를 공유 할 수있는 새로운 방법을 시작하는 SESSION_CONTEXT 및 sp_set_session_context를 통해 소개된다.

    당신은 128 바이트로 제한 만 이진 값을 지속 CONTEXT_INFO ()의 대안으로 사용할 수 있습니다. 또한, 사용자는 값 언제든지 다시 작성할 수 있으며 보안 검사를 위해 그것을 사용하는 것은 매우 좋지 않다.

    다음 문제는 새로운 유틸을 사용하여 해결됩니다. 좀 더 사용자 친화적 인 형식으로 데이터를 저장할 수 있습니다 :

    EXEC sp_set_session_context 'language', 'English';  
    SELECT SESSION_CONTEXT(N'language');
    

    또한, 우리는 읽기 전용으로 표시 할 수 있습니다 :

    EXEC sp_set_session_context 'user_id', 4, @read_only = 1;  
    

    읽기 전용 세션 컨텍스트를 수정하려고하면이 같은 것을 얻을 것이다 :

  5. ==============================

    5.당신은 변수의 값을 반환 스칼라 반환 함수를 작성하여 유사한 결과를 얻을 수 있습니다. 물론, 당신은 결과의 큰 숫자를 반환하는 쿼리에서 사용할 경우 함수 호출은 비쌀 수 있지만, 결과 집합을 제한하는 경우 당신은 괜찮을 것이다. 여기에 나는이 반 정적 값을 유지하기 위해 방금 만든 데이터베이스를 사용하고 있지만, 너무 당 데이터베이스 기준을 만들 수 있습니다. 당신이 함수에서 그 값을 변경하는 경우, 그것은 바로 그것 (이 호출 다음 번) 사용되는 어디서든 변경됩니다 : 당신이 볼 수 있듯이, 어떤 입력 변수, 반환 정적 값이 것을 그냥 잘이라는 기능이 없습니다.

    당신은 변수의 값을 반환 스칼라 반환 함수를 작성하여 유사한 결과를 얻을 수 있습니다. 물론, 당신은 결과의 큰 숫자를 반환하는 쿼리에서 사용할 경우 함수 호출은 비쌀 수 있지만, 결과 집합을 제한하는 경우 당신은 괜찮을 것이다. 여기에 나는이 반 정적 값을 유지하기 위해 방금 만든 데이터베이스를 사용하고 있지만, 너무 당 데이터베이스 기준을 만들 수 있습니다. 당신이 함수에서 그 값을 변경하는 경우, 그것은 바로 그것 (이 호출 다음 번) 사용되는 어디서든 변경됩니다 : 당신이 볼 수 있듯이, 어떤 입력 변수, 반환 정적 값이 것을 그냥 잘이라는 기능이 없습니다.

    USE [globalDatabase]
    GO
    
    CREATE FUNCTION dbo.global_GetStandardFonts ()
    RETURNS NVARCHAR(255)
    AS
    BEGIN
        RETURN 'font-family:"Calibri Light","sans-serif";'
    END
    GO
    
    --  Usage: 
    SELECT '<html><head><style>body{' + globalDatabase.dbo.global_GetStandardFonts() + '}</style></head><body>...'
    
    --  Result: <html><head><style>body{font-family:"Calibri Light","sans-serif";}</style></head><body>...
    
  6. ==============================

    6.사용하려고; 대신 GO의. 그것은 2008 R2 버전 나를 위해 일한

    사용하려고; 대신 GO의. 그것은 2008 R2 버전 나를 위해 일한

    DECLARE @GLOBAL_VAR_1 INT = Value_1;
    
    DECLARE @GLOBAL_VAR_2 INT = Value_2;
    
    USE "DB_1";
    SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_1 
    
    AND "COL_2" = @GLOBAL_VAR_2;
    
    USE "DB_2";
    
    SELECT * FROM "TABLE" WHERE "COL_!" = @GLOBAL_VAR_2;
    
  7. ==============================

    7.특정 예에서 오류가 있기 때문에 사용에 문 후 GO의입니다. 어떤 사용자 변수가 존재하지 않도록 GO 문은 환경을 재설정합니다. 그들은 다시 선언해야합니다. 적어도 SQL Server 버전이 같거나 이전에 2008 년에 나는 새로운 SQL 서버 버전에 대해 동일한 보장 할 수 없습니다에 글로벌 변수의 질문에 대한 대답이 '아니오', 글로벌 변수를 존재하지 않습니다.

    특정 예에서 오류가 있기 때문에 사용에 문 후 GO의입니다. 어떤 사용자 변수가 존재하지 않도록 GO 문은 환경을 재설정합니다. 그들은 다시 선언해야합니다. 적어도 SQL Server 버전이 같거나 이전에 2008 년에 나는 새로운 SQL 서버 버전에 대해 동일한 보장 할 수 없습니다에 글로벌 변수의 질문에 대한 대답이 '아니오', 글로벌 변수를 존재하지 않습니다.

    문안 인사, Hini

  8. ==============================

    8.나는 각각의 전역 변수에 대한 열이있는 테이블을 사용하는 방식을 좋아한다. 이 방법 당신은 변수의 검색을 코딩에 도움이 자동 완성을 얻을. 여기에 설명 된대로 테이블은 하나의 행으로 제한 할 수 있습니다 : SQL 서버 : 어떻게 하나의 행을 포함하는 테이블을 제한하려면?

    나는 각각의 전역 변수에 대한 열이있는 테이블을 사용하는 방식을 좋아한다. 이 방법 당신은 변수의 검색을 코딩에 도움이 자동 완성을 얻을. 여기에 설명 된대로 테이블은 하나의 행으로 제한 할 수 있습니다 : SQL 서버 : 어떻게 하나의 행을 포함하는 테이블을 제한하려면?

  9. ==============================

    9.SQL Server의 전역 변수를 선언 할 수 없습니다. SQL Server는 글로벌 변수의 개념을 가지고 있지만, 그들은 시스템의 정의 및 확장 할 수 없습니다.

    SQL Server의 전역 변수를 선언 할 수 없습니다. SQL Server는 글로벌 변수의 개념을 가지고 있지만, 그들은 시스템의 정의 및 확장 할 수 없습니다.

    SqlCommand를 예를 들어 같은 변수 교체 메커니즘이 - - 분명히 당신은 당신이 보내는 SQL 트릭의 모든 종류의 작업을 수행 할 수 있습니다 당신이 SQLSERVER로 전송하기 전에,하지만 그것에 대해입니다.

  10. ==============================

    10.

    declare @ID_var int
    set @ID_var = 123456
    
    select * from table where ID_var = @ID_var
    

    또는

    declare @ID_var varchar(30)
    set @ID_var = 123456
    
    select * from table where ID_var = @ID_var
    
  11. ==============================

    11.내 첫 번째 질문은 (즉 2005, 2008, 2008 R2, 2012)를 사용하는 SQL Server 버전인가?

    내 첫 번째 질문은 (즉 2005, 2008, 2008 R2, 2012)를 사용하는 SQL Server 버전인가?

    당신은 2008 이상을 사용하는 SQL 변수 결정에 대한 범위를 사용하는 가정. 나는 세계 및 지역 변수의 차이를 정의하는 것 대신에 @variable 이름의 @@ 여기서 variableName을 사용 2005 여전히 한 글로벌 변수를 생각합니다. 2008 년부터 나는이 범위 정의 변수 지정 구조로 변경되었습니다 생각합니다. 예를 글로벌 변수를 만들 위해 @variable는 2008 년 등, 절차, 기능,보기의 시작에서 정의하고 나중에 @@ 나는 믿는다 시스템 기능에 대한 시스템 변수를 정의 할 수 있습니다. 이 버전도 변수가 정의되고 있으며, 당신이지고있는 오류를 설명하면 내가 더 설명 할 수있다.

  12. from https://stackoverflow.com/questions/22372359/how-to-declare-global-variable-in-sql-server by cc-by-sa and MIT license