복붙노트

[SQL] SQL의 이동과 동적 쿼리를 실행

SQL

SQL의 이동과 동적 쿼리를 실행

DECLARE @script VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    go
    create table ali(id decimal(10,0));
    drop table ali;
    '

EXEC (@script);

쿼리 위에 실행할 때 오류 메시지가 발생했습니다. 당신이 해결이에 대한 아이디어가 있다면 알려주세요.

참고 : 만들고 단지, 예를 들면 만든 테이블을 삭제하기위한 위의 코드, 내가 가서 문을 다른 동적 쿼리가 있습니다. 이 대답을하지 마십시오.

DECLARE @script   VARCHAR(MAX),
        @script1  VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
SET @script1 = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
EXEC (@script);
EXEC (@script1);

해결법

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

    1.GO 실제로 유효하지 않습니다 T-SQL이다 :

    GO 실제로 유효하지 않습니다 T-SQL이다 :

    당신은 당신의 동적 SQL에서 GO의 인스턴스를 제거하거나 (예 : 명령 줄에서 OSQL 등) 기사에 언급 된 도구 중 하나를 사용해야합니다. GO의 모든 인스턴스는 동적 SQL에서 제거하여 쿼리는 여전히 작동합니다.

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

    2.난 그냥있어 여기에 모두가 "GO"키워드를 끊었 생각합니다.

    난 그냥있어 여기에 모두가 "GO"키워드를 끊었 생각합니다.

    해결책:

    --Your Script modified by adding a single line of code:
    DECLARE @script nVarChar(MAX);--I changed from VarChar to nVarChar - you should always use nVarChar for Dynamic SQL.
    SET @script = 
        '
        create table ali(id decimal(10,0));
        drop table ali;
        go
        create table ali(id decimal(10,0));
        drop table ali;
        '
        --In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
    SET @script = 'EXEC (''' + REPLACE(REPLACE(@script, '''', ''''''), 'GO', '''); EXEC(''') + ''');'--Just add this one line.
    PRINT @script --See the command used (will be truncated in Select/Print, but not when Executing).
    EXEC (@script);
    

    동적 테이블에서 여러 문을 연결 솔루션을 찾고 사람들을 위해 :

    --Example of compiling and chaining multiple DDL statments from data in a table:
    -- DDL (Data Definition Language).
    --  These are statements used to create, alter, or drop data structures.
    --  They MUST be run in a single Batch.
    --  The "GO" keyword is a SSMS syntax for splitting up batches - it is not an SQL keyword.
    DECLARE @DDL_Statements TABLE
    (
      DDL nVarChar(MAX)
    )
    INSERT INTO @DDL_Statements (DDL)
        SELECT 'create table ali(id decimal(10,0)); drop table ali;' UNION ALL
        SELECT 'create table ali(id decimal(10,0)); drop table ali;'
    DECLARE @SqlCommand nVarChar(MAX) = ''
     SELECT @SqlCommand = @SqlCommand + 'EXEC(''' + REPLACE(DS.DDL, '''', '''''') + '''); '
       FROM @DDL_Statements as DS --In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
    PRINT @SqlCommand --See the command used (will be truncated in Select/Print, but not when Executing).
    EXEC (@SqlCommand)
    
  3. ==============================

    3.@mellamokb에 의해 명시된 바와 같이 당신은 단순히 동적 T-SQL 쿼리에 GO를 사용할 수 없습니다.

    @mellamokb에 의해 명시된 바와 같이 당신은 단순히 동적 T-SQL 쿼리에 GO를 사용할 수 없습니다.

    당신이 당신의 질문의 두 번째 부분에 명시된 바와 같이, 별도의 SQL-쿼리를 실행하지 않기 때문에, 당신은 분할에 의해 자신 별도의 일괄 처리에서 쿼리를 멀리 얻을 수 있습니다.

    당신은 UDF를 사용하여 GO에 쿼리를 분리 할 수있다. 분리 한 후, 분리 된 배치를 실행한다.

    그러나 처음에 GO 문자열을 만든 다음 나중에 잠시 떨어져 휴식, 자연 생각하지 않습니다.

  4. ==============================

    4.GO는 일괄 구분자이며, 다른 사람에 의해 지적 유효한 SQL하지 않습니다. 예를 들어 일괄 구분자로 사용할 수 COME, SQL Server 및 다른 텍스트를 입력 - 옵션 - - 쿼리 실행 도구 - 사실, 당신은 SSMS로 이동할 수 있습니다.

    GO는 일괄 구분자이며, 다른 사람에 의해 지적 유효한 SQL하지 않습니다. 예를 들어 일괄 구분자로 사용할 수 COME, SQL Server 및 다른 텍스트를 입력 - 옵션 - - 쿼리 실행 도구 - 사실, 당신은 SSMS로 이동할 수 있습니다.

    당신이 그렇게한다면 GO도 SSMS에서 인식되지 않습니다. 당신은 동적 SQL 일괄 구분자 없이도 실행해야합니다. 여기 GO의 필요성을 보지 않는다

    주권

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

    5.당신이 될 것이다 동적 SQL에서 GO를 사용하고자 할 때의 예 나는 데이터를 몇 테이블을 채울 필요가 있고 나는 그것을 실행할 시간을 나타내는과 n은 n은 GO를 사용하고 싶습니다.

    당신이 될 것이다 동적 SQL에서 GO를 사용하고자 할 때의 예 나는 데이터를 몇 테이블을 채울 필요가 있고 나는 그것을 실행할 시간을 나타내는과 n은 n은 GO를 사용하고 싶습니다.

            DECLARE @statement TABLE
            (
              SqlCommand NVARCHAR(MAX)
            )
    
    DECLARE @sqlCommand NVARCHAR(MAX) = 'INSERT INTO [dbo].[tbl_table1] ([Field1],[Field2],[Field3],[Field4],[Field5],[Field6],[Field7],[Field8],[Field9],[Field10],[Field11])SELECT ''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j'',RAND(),RAND(),RAND()
    GO 10000'
    INSERT  INTO @statement
                ( SqlCommand )
        VALUES  ( @sqlCommand )
        SET @sqlCommand = REPLACE(@sqlCommand, '[tbl_table1]', '[tbl_table2]')
        INSERT  INTO @statement
                ( SqlCommand )
        VALUES  ( @sqlCommand )
    

    내가 복사 대신 할 수있는의 실행해야이 코드는 선택 문의 테이블을 생성 작동합니다

    EXEC(@sqlCommand)
    

    어떤 '10000'오류 근처에 잘못된 구문을 제공합니다.

  6. from https://stackoverflow.com/questions/14473223/execute-dynamic-query-with-go-in-sql by cc-by-sa and MIT license