bestsource

선택 결과를 삽입 스크립트로 변환하는 중 - SQL Server

bestsource 2023. 5. 24. 22:16
반응형

선택 결과를 삽입 스크립트로 변환하는 중 - SQL Server

SQL Server 2008, SQL Server Management Studio가 있습니다.

한 데이터베이스의 테이블에서 데이터를 선택하고 다른 데이터베이스의 다른 테이블에 삽입해야 합니다.

가 선택한 선한결과반결로 변환할 수요?INSERT INTO ...?

설명을 통한 설명:이 문제는 다음과 같은 방법으로 해결될 것 같습니다.INSERT INTO SELECT또는SELECT INTO는 생해야합다니를 해야 합니다.INSERT INTO ....

다음은 플러그인이나 외부 도구를 설치하는 것보다 더 쉬운 다른 방법입니다.

  • 를 .select [whatever you need]INTO temp.table_namefrom [... etc ...].
  • Object Explorer = > Tasks = > Generate Scripts에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭합니다.
  • 를 선택합니다.temp.table_name개체 선택 화면에서 다음을 클릭합니다.
  • 스크립트 저장 방법 지정 화면에서 다음을 수행합니다.
    • 고급을 클릭하고 "스크립트할 데이터 유형" 속성을 찾은 다음 "데이터 전용"을 선택하고 고급 속성을 닫습니다.
    • 새 쿼리 창에 저장을 선택합니다(수천 개의 레코드가 없는 경우).
  • 후 합니다.INSERT문이 새 쿼리 창에 나타납니다.
  • & 하여 모든 찾기 & 바를여하모두변을 합니다.[temp.table_name][your_table_name].
  • drop table [temp.table_name].

SSMS의 경우:

  • 데이터베이스 > 작업 > 스크립트 생성을 마우스 오른쪽 버튼으로 클릭합니다.

  • 다음 분.

  • "특정 데이터베이스 개체 선택"을 선택하고 스크립팅할 표를 선택한 후 다음

  • Advanced > " data to script " Only" > 합니다.

  • "Save to new query window" > Next > Next > Finish를 선택합니다.

이제 모든 180행이 180개의 삽입 문으로 작성됩니다.

기본 방법:

예를 들어 테이블이 있는 경우

Users(Id, name)

다음을 수행할 수 있습니다.

select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users

1 - 스크립트 설명

테이블에 데이터를 삽입하기 위한 구문은 다음과 같습니다.

Insert into table(col1,col2,col3,col4,col5)    

             -- To achieve this part i    
             --have used below variable
                ------@CSV_COLUMN-------

values(Col1 data in quote, Col2..quote,..Col5..quote)

-- To achieve this part 
-- i.e column data in 
--quote i have used 
--below variable
----@QUOTED_DATA---

기존 테이블에서 위의 데이터를 가져오려면 출력이 위의 스크립트 형식이 되도록 선택 쿼리를 작성해야 합니다.

그리고 마침내 나는 실행 시 삽입 스크립트를 생성할 최종 스크립트를 만들기 위해 위의 변수를 연결했습니다.

E)

@TEXT='SELECT ''INSERT INTO
 '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION

의 쿼리를 실행했습니다.EXECUTE(TEXT)

QUOTENAME() 안에 열 때 합니다.

ISNULL에 를가행 있경사우가 있을 됩니다.NULL됩니다.NULL그것이 내가 사용한 것을 피하는 이유입니다.ISNULL

sp 고를 sp 습들니다만었리그를 만들었습니다.sp_generate_insertscripts마찬가지로

1 - 원하는 테이블 이름만 입력합니다.insert script

2 - 특정 결과를 원하는 경우 필터 조건

----------Final Procedure To generate Script------

CREATE PROCEDURE sp_generate_insertscripts
(
    @TABLE_NAME VARCHAR(MAX),
    @FILTER_CONDITION VARCHAR(MAX)=''
)
AS
BEGIN

SET NOCOUNT ON

DECLARE @CSV_COLUMN VARCHAR(MAX),
        @QUOTED_DATA VARCHAR(MAX),
        @TEXT VARCHAR(MAX)

SELECT @CSV_COLUMN=STUFF
(
    (
     SELECT ',['+ NAME +']' FROM sys.all_columns 
     WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND 
     is_identity!=1 FOR XML PATH('')
    ),1,1,''
)

SELECT @QUOTED_DATA=STUFF
(
    (
     SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns 
     WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND 
     is_identity!=1 FOR XML PATH('')
    ),1,1,''
)

SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION

--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT

EXECUTE (@TEXT)

SET NOCOUNT OFF

END

SSMS Toolpack(맥주처럼 무료)에는 테이블에서 INSERT 문을 생성하는 등 다양한 기능이 있습니다.

업데이트: SQL Server Management Studio 2012 이상의 경우 SSMS Toolpack은 더 이상 무료가 아니지만 약간의 라이센스 비용이 필요합니다.

Visual Studio SQL Server Object Explorer를 통해 작업할 수 있습니다.

상황에 맞는 메뉴에서 "View Data"를 클릭하여 필요한 테이블의 결과를 필터링하고 결과를 스크립트로 저장할 수 있습니다.

비주얼 스튜디오를 사용하여 다음을 수행합니다.

SQL Server 유형의 프로젝트 생성-->SQL Server 데이터베이스 프로젝트

sql server 탐색기 CTL-\ , CTL-S를 엽니다.

SQL Server 아이콘을 마우스 오른쪽 버튼으로 클릭하여 SQL Server를 추가합니다.새 서버 추가 선택

관심 있는 테이블로 이동합니다.

오른쪽 클릭--> VIEW DATA

왼쪽 상단 셀을 클릭하여 모든 항목을 강조 표시합니다(ctl-A가 작동하지 않는 것 같습니다).

마우스 오른쪽 단추 클릭 -->SCRIPT

정말 멋지네요.저는 몇 년 동안 위에 나열된 모든 것을 시도해 왔습니다.저는 이것을 할 수 있는 도구가 있다는 것을 알고 있고 그 이상의 것을 할 수 있습니다. 그것의 이름을 생각할 수 없습니다.하지만 그것은 매우 비쌉니다.

행운을 빌어요.이제야 알았어요.텍스트 필드 등을 사용하여 광범위하게 테스트하지는 않았지만 앞으로 많은 도움이 될 것으로 보입니다.

그렉

into 문을 사용하여 별도의 테이블을 만듭니다.

[dbo]에서 Test_123에 *를 선택합니다.[직원] 여기서 이름은 '%Test%'와 같습니다.

데이터베이스로 이동 데이터베이스 오른쪽 버튼 클릭 스크립트 생성 클릭 테이블 선택 고급 옵션 선택 및 속성 선택 "데이터 전용" 파일 선택 "새 쿼리에서 열기"

SQL이 스크립트를 생성합니다.

이 솔루션은 보다 다양한 용도로 사용할 수 있으며(질문에서 요구하는 것보다 조금 더 많은 작업을 수행할 수 있음), 새로운 저장 프로시저를 생성하지 않고도 쿼리 창에서 사용할 수 있습니다. 예를 들어, 쓰기 액세스 권한이 없는 프로덕션 데이터베이스에서 유용합니다.

코드를 사용하기 위해서는 사용법을 설명하는 인라인 코멘트에 따라 수정해 주세요.그런 다음 쿼리 창에서 이 쿼리를 실행하면 필요한 INSERT 문이 인쇄됩니다.

SET NOCOUNT ON

-- Set the ID you wish to filter on here
DECLARE @id AS INT = 123

DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128))

-- Add any tables you wish to generate INSERT statements for here. The fields are as thus:
 -- Name: Your table name
 -- IdField: The field on which to filter the dataset
 -- IdInsert: If the primary key field is to be included in the INSERT statement
 -- Excluded: Any fields you do not wish to include in the INSERT statement
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable1', 'Id', 0, 'Created,Modified')
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable2', 'Id', 1, 'Created,Modified')

DECLARE @numberTypes TABLE (sysId TINYINT)

-- This will ensure INT and BIT types are not surrounded with quotes in the
-- resultant INSERT statement, but you may need to add more (from sys.types)
INSERT @numberTypes(SysId) VALUES(56),(104)

DECLARE @rows INT = (SELECT COUNT(*) FROM @tables)
DECLARE @cnt INT = 1

DECLARE @results TABLE (Sql NVARCHAR(4000))

WHILE @cnt <= @rows
BEGIN
    DECLARE @tablename AS NVARCHAR(128)
    DECLARE @idField AS NVARCHAR(128)
    DECLARE @idInsert AS BIT
    DECLARE @excluded AS NVARCHAR(128)
    SELECT
        @tablename = Name,
        @idField = IdField,
        @idInsert = IdInsert,
        @excluded = Excluded
    FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt

    DECLARE @excludedFields TABLE (FieldName NVARCHAR(128))
    DECLARE @xml AS XML = CAST(('<X>' + REPLACE(@excluded, ',', '</X><X>') + '</X>') AS XML)
    INSERT INTO @excludedFields SELECT N.value('.', 'NVARCHAR(128)') FROM @xml.nodes('X') AS T(N)

    DECLARE @setIdentity NVARCHAR(128) = 'SET IDENTITY_INSERT ' + @tablename

    DECLARE @execsql AS NVARCHAR(4000) = 'SELECT ''' + CASE WHEN @idInsert = 1 THEN @setIdentity + ' ON' + CHAR(13) ELSE '' END + 'INSERT INTO ' + @tablename + ' ('
    SELECT @execsql = @execsql +
    STUFF
    (
        (
            SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN ', ' + name ELSE '' END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 2, ''
    ) +
    ')' + CHAR(13) + 'VALUES (' +
    STUFF
    (
        (
            SELECT
                CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN
                    ''', '' + ISNULL(' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ''''''''' + ' END +
                    'CAST(' + name + ' AS VARCHAR)' +
                    CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ' + ''''''''' END +
                    ', ''NULL'') + '
                ELSE ''
                END
            FROM sys.columns
            WHERE object_id = OBJECT_ID('dbo.' + @tablename)
            FOR XML PATH('')
        ), 1, 3, ''
    ) +
    ''')' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + ' OFF' ELSE '' END +
    ''' FROM ' + @tablename + ' WHERE ' + @idField + ' = ' + CAST(@id AS VARCHAR)

    INSERT @results EXEC (@execsql)
    DELETE @excludedFields
    SET @cnt = @cnt + 1
END

DECLARE cur CURSOR FOR SELECT Sql FROM @results
OPEN cur

DECLARE @sql NVARCHAR(4000)
FETCH NEXT FROM cur INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @sql
    FETCH NEXT FROM cur INTO @sql
END

CLOSE cur
DEALLOCATE cur

SSMS에서 'Result to File' 옵션을 선택하고 선택한 결과를 파일로 내보낸 후 결과 파일을 변경하고 마지막으로 BCP - 데이터베이스 2의 표 1에 삽입할 수 있는 대량 복사본을 사용할 수 있습니다.

대량 삽입을 위해서는 .rpt 파일을 .csv 파일로 변환해야 한다고 생각합니다.

도움이 되길 바랍니다.

다음을 만들었습니다.procedure:

if object_id('tool.create_insert', 'P') is null
begin
  exec('create procedure tool.create_insert as');
end;
go

alter procedure tool.create_insert(@schema    varchar(200) = 'dbo',
                                   @table     varchar(200),
                                   @where     varchar(max) = null,
                                   @top       int = null,
                                   @insert    varchar(max) output)
as
begin
  declare @insert_fields varchar(max),
          @select        varchar(max),
          @error         varchar(500),
          @query         varchar(max);

  declare @values table(description varchar(max));

  set nocount on;

  -- Get columns
  select @insert_fields = isnull(@insert_fields + ', ', '') + c.name,
         @select = case type_name(c.system_type_id)
                      when 'varchar' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + cast(' + c.name + ' as varchar) + '''''''', ''null'')'
                      when 'datetime' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + convert(varchar, ' + c.name + ', 121) + '''''''', ''null'')'
                      else isnull(@select + ' + '', '' + ', '') + 'isnull(cast(' + c.name + ' as varchar), ''null'')'
                    end
    from sys.columns c with(nolock)
         inner join sys.tables t with(nolock) on t.object_id = c.object_id
         inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id
   where s.name = @schema
     and t.name = @table;

  -- If there's no columns...
  if @insert_fields is null or @select is null
  begin
    set @error = 'There''s no ' + @schema + '.' + @table + ' inside the target database.';
    raiserror(@error, 16, 1);
    return;
  end;

  set @insert_fields = 'insert into ' + @schema + '.' + @table + '(' + @insert_fields + ')';

  if isnull(@where, '') <> '' and charindex('where', ltrim(rtrim(@where))) < 1
  begin
    set @where = 'where ' + @where;
  end
  else
  begin
    set @where = '';
  end;

  set @query = 'select ' + isnull('top(' + cast(@top as varchar) + ')', '') + @select + ' from ' + @schema + '.' + @table + ' with (nolock) ' + @where;

  insert into @values(description)
  exec(@query);

  set @insert = isnull(@insert + char(10), '') + '--' + upper(@schema + '.' + @table);

  select @insert = @insert + char(10) + @insert_fields + char(10) + 'values(' + v.description + ');' + char(10) + 'go' + char(10)
    from @values v
   where isnull(v.description, '') <> '';
end;
go

그런 다음 다음과 같이 사용할 수 있습니다.

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'customer',
                        @where  = 'id = 1',
                        @insert = @insert output;

-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
  set @end = charindex(char(10), @insert);

  if @end = 0
  begin
    set @end = len(@insert) + 1;
  end;

  print substring(@insert, @start, @end - 1);
  set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;

출력은 다음과 같습니다.

--DBO.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go

행 범위만 가져오려면@top파라미터는 다음과 같습니다.

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'customer',
                        @top    = 100,
                        @insert = @insert output;

-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
  set @end = charindex(char(10), @insert);

  if @end = 0
  begin
    set @end = len(@insert) + 1;
  end;

  print substring(@insert, @start, @end - 1);
  set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;

비슷한 문제가 있었지만 쿼리(필터 등)에서 INSERT 문을 만들 수 있어야 했습니다.

그래서 다음과 같은 절차를 만들었습니다.

CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN

    DECLARE @fields NVARCHAR(max);
    DECLARE @select NVARCHAR(max);

    -- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query
    SELECT
        @fields = COALESCE(@fields + ', ', '') + '[' + name +']', 
        @select = COALESCE(@select + ', ', '') + ''''''' + ISNULL(CAST([' + name + '] AS NVARCHAR(max)), ''NULL'')+'''''''
    FROM tempdb.sys.columns 
    WHERE [object_id] = OBJECT_ID(N'tempdb..'+@input);

    -- Run the a dynamic query with the fields from @select into a new temp table
    CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max))
    DECLARE @stmt NVARCHAR(max) = 'INSERT INTO #ConvertQueryToInsertTemp SELECT '''+ @select + ''' AS [strings] FROM '+@input
    exec sp_executesql @stmt

    -- Output the final insert statement 
    SELECT 'INSERT INTO ' + @target + ' (' + @fields + ') VALUES (' + REPLACE(strings, '''NULL''', 'NULL') +')' FROM #ConvertQueryToInsertTemp

    -- Clean up temp tables
    DROP TABLE #ConvertQueryToInsertTemp
    SET @stmt = 'DROP TABLE ' + @input
    exec sp_executesql @stmt
END

그런 다음 쿼리 출력을 임시 테이블에 기록하고 다음 절차를 실행하여 사용할 수 있습니다.

-- Example table
CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME)
INSERT INTO Dummy VALUES (1 , 'Foo', GetDate()), (2, 'Bar', GetDate()), (3, 'Foo Bar', GetDate())

-- Run query and procedure
SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3
EXEC dbo.ConvertQueryToInsert '#TempTableForConvert', 'dbo.Dummy'

참고: 이 절차에서는 데이터가 약간 다르게 보일 수 있는 문자열에만 값을 캐스팅합니다.예를 들어 DATTIME을 사용하면 초가 손실됩니다.

가져오기내보내기 작업을 위해 특별히 설계된 SQL 서버 통합 서비스 패키지를 사용할 수 있습니다.

VS에는 SQL 서버를 완전히 설치한 경우 이러한 패키지를 개발하기 위한 패키지가 있습니다.

비즈니스 인텔리전스 개발 스튜디오의 통합 서비스

또한 임시 쿼리를 사용하여 결과를 Excel 파일로 내보낸 다음 해당 파일을 데이터 테이블 개체로 가져오거나 그대로 사용하여 두 번째 데이터베이스로 Excel 파일을 가져오면 많은 도움이 될 수 있습니다.

http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html

Oracle을 사용하는 경우(또는 애플리케이션을 SQL Server로 구성하는 경우) Oracle SQL Developer가 이 작업을 대신 수행합니다.테이블에 대해 '언로드'를 선택하고 옵션을 끝까지 따릅니다(모든 테이블에서 항목을 만들지 않으려면 DDL을 선택 취소하십시오).

저는 SMSMS Boost 애드온을 찾았습니다. 무료이며 다른 것들 중에서도 정확히 이 기능을 합니다.결과를 마우스 오른쪽 버튼으로 클릭하고 다음으로 데이터 스크립팅을 선택할 수 있습니다.

Q2C를 사용할 수 있습니다.자유롭고 오픈 소스인 SSMS 플러그인.마우스 오른쪽 단추를 클릭하고 "명령에 쿼리 실행..."을 선택할 수 있습니다.-> 삽입할 쿼리... . 즐겨찾기)

사용할 수 있습니다.INSERT INTO SELECT선택한 쿼리의 결과를 테이블에 삽입하는 문입니다.http://www.w3schools.com/sql/sql_insert_into_select.asp

예:

INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country
FROM Suppliers
WHERE Country='Germany'

언급URL : https://stackoverflow.com/questions/4526461/converting-select-results-into-insert-script-sql-server

반응형