[SQL] 삽입 스크립트에 선택 결과를 변환 - SQL 서버 [마감]
SQL삽입 스크립트에 선택 결과를 변환 - SQL 서버 [마감]
내가 가진 SQL 서버 2008, SQL Server Management Studio를.
나는 database1의 표에서 데이터를 선택해야합니다. 그럼 난 편집에 결과 및 DATABASE2의 표에 값을 삽입 일부 값을 가지고있다.
또는 내가 그것을 다른 방법을 넣어 보자.
어떻게 삽입 스크립트에 하나 개의 테이블에서 데이터를 변환 할 수 있습니다.
해결법
-
==============================
1.테이블에서 INSERT 문을 생성 포함 - (맥주로 무료입니다) SSMS Toolpack 큰 다양한 기능이 있습니다.
테이블에서 INSERT 문을 생성 포함 - (맥주로 무료입니다) SSMS Toolpack 큰 다양한 기능이 있습니다.
업데이트 : SQL Server 관리 Studio 2012 (및 이상)에 대한, SSMS Toolpack는 더 이상 무료 없지만, 겸손한 라이센스 비용을 필요로한다.
-
==============================
2.다음은 몇 가지 상황에서 플러그인이나 외부 도구를 설치하는 것보다 쉬울 수있는 또 다른 방법이있다 :
다음은 몇 가지 상황에서 플러그인이나 외부 도구를 설치하는 것보다 쉬울 수있는 또 다른 방법이있다 :
-
==============================
3.에서 SSMS :
에서 SSMS :
모든 180 행은 이제 180 삽입 문으로 작성!
-
==============================
4.기본 방법 :
기본 방법 :
예를 들어, 당신은 테이블이있는 경우
Users(Id, name)
이 작업을 수행 할 수 있습니다 :
select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
-
==============================
5.1 스크립트의 설명
1 스크립트의 설명
테이블의 데이터를 삽입하기위한 A) 구문은 다음과 같다
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---
기존에서 C)는 데이터의 위 얻으려면 표는 우리가 선택을 작성해야 출력이 그와 같은 방법으로 쿼리 위의 스크립트와 같은 형태로 될 것입니다
D) 그리고 마지막으로 내가 연접가 상기 가변 만들 의지의 최종 스크립트 실행에 삽입 스크립트를 생성
IS)
@TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION
F) 그리고 마지막으로 위의 질의는 EXECUTE 실행 된 (TEXT)
G) QUOTENAME () 함수는 랩으로 사용 따옴표 안에 열 데이터
임의의 행이 NULL이 있으면 때문에 H)이 사용된다 ISNULL 데이터는 열에 대한 쿼리가 실패 및 반환 NULL 이잖아 왜 피하려면 내가 사용하고 그 ISNULL
I)과 같은 위해 만든 SP sp_generate_inserts 스크립트
1 단지는 스크립트를 삽입하고자하는 테이블 이름을 넣어
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
-
==============================
6.그것은 비주얼 스튜디오 SQL 서버 개체 탐색기를 통해 할 수있다.
그것은 비주얼 스튜디오 SQL 서버 개체 탐색기를 통해 할 수있다.
당신은 필요한 테이블, 필터 결과 및 스크립트 등의 결과를 저장 컨텍스트 메뉴에서 "데이터보기"를 클릭 할 수 있습니다.
-
==============================
7.비주얼 스튜디오를 사용하여 다음을 수행
비주얼 스튜디오를 사용하여 다음을 수행
형 SQL 서버의 프로젝트를 생성 -> SQL Server 데이터베이스 프로젝트
CTL- 탐색기에서 SQL Server를 열고 \, CTL-S
SQL 서버 아이콘을 마우스 오른쪽 버튼으로 클릭하여 SQL 서버를 추가합니다. 선택 ADD NEW 서버
관심있는 테이블 아래로 이동
마우스 오른쪽 버튼으로 클릭 -> 데이터보기
(CTLA가 작동하지 않는 것) 하이라이트 모든 것을 왼쪽 상단 셀을 클릭
마우스 오른쪽 클릭 -> 스크립트
이 멋진입니다. 나는 수년에 걸쳐 위에 나열된 모든 것을 시도했다. 나는이 작업을 수행하고 훨씬 더, 그것의 이름을 생각하지 못할 거기 도구가 알고있다. 그러나 그것은 매우 비싸다.
행운을 빕니다. 난 그냥이 아웃 생각. 그것은 등 광범위하게 w / 텍스트 필드 테스트를하지만, 그것은 당신에게 길 아래로 긴 방법을 얻을 것 같습니다하지 않았습니다.
그렉
-
==============================
8.문에 사용하여 별도의 테이블을 만듭니다 예를 들면
문에 사용하여 별도의 테이블을 만듭니다 예를 들면
[DBO]에서 Test_123에 *를 선택합니다. [직원] 여기서 이름 '% 테스트 %'와 같은
데이터베이스로 이동 마우스 오른쪽 버튼으로 데이터베이스를 클릭합니다 스크립트를 생성에 클릭 테이블을 선택 advanace 옵션을 선택하고 속성을 선택 "데이터 전용" "새 쿼리에서 열린"파일을 선택
SQL은 당신을위한 스크립트를 생성합니다
-
==============================
9.당신은 BCP를 사용하여 마지막으로 선택 SSMS에서 옵션 '파일에 결과'및 파일에 선택 결과를 내보내고 결과 파일의 변경을 할 수 있습니다 - 대량 당신이 데이터베이스 2 표 1에 삽입 할 수 있습니다 복사합니다.
당신은 BCP를 사용하여 마지막으로 선택 SSMS에서 옵션 '파일에 결과'및 파일에 선택 결과를 내보내고 결과 파일의 변경을 할 수 있습니다 - 대량 당신이 데이터베이스 2 표 1에 삽입 할 수 있습니다 복사합니다.
당신이 .CSV 파일로 .RPT 파일을 변환해야 INSERT I 대량에 대한 생각
그것이 도움이되기를 바랍니다.
-
==============================
10.(필터 등으로) 나는 비슷한 문제가 있었다,하지만 난 쿼리에서 INSERT 문을 만들 수 있도록 필요한
(필터 등으로) 나는 비슷한 문제가 있었다,하지만 난 쿼리에서 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'
노트 : 이 절차는 데이터가 비트 다른 모습 발생할 수있는 문자열에 값을 캐스팅합니다. 예를 들어 DATETIME으로 초는 손실됩니다.
-
==============================
11.이것은 더 솔루션을 다양한 (즉, 더 많은 질문을 물어보다 조금 할 수 있음), 그리고 새로운 저장된 프로 시저 작성하지 않고도 쿼리 창에서 사용할 수 있습니다 - 당신은 쓰기 권한이없는 예를 들어 프로덕션 데이터베이스에서 유용 .
이것은 더 솔루션을 다양한 (즉, 더 많은 질문을 물어보다 조금 할 수 있음), 그리고 새로운 저장된 프로 시저 작성하지 않고도 쿼리 창에서 사용할 수 있습니다 - 당신은 쓰기 권한이없는 예를 들어 프로덕션 데이터베이스에서 유용 .
코드를 사용하려면, 그 사용법을 설명하는 선에서 의견에 따라 수정하십시오. 당신은 단지 쿼리 창에서이 쿼리를 실행할 수 있으며, 그것은 당신이 필요로하는 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
-
==============================
12.당신은 특별히 가져 오기 및 내보내기 작동하도록 설계는 SQL 서버 통합 서비스 패키지를 사용할 수 있습니다.
당신은 특별히 가져 오기 및 내보내기 작동하도록 설계는 SQL 서버 통합 서비스 패키지를 사용할 수 있습니다.
VS는 완전히는 SQL 서버를 설치하면이 패키지를 개발하기위한 패키지를 가지고있다.
비즈니스 인텔리전스 개발 Studio의 통합 서비스
-
==============================
13.나는 애드혹 쿼리의 수도 생각 당신은 엑셀 파일에 결과를 내 보낸 다음 DataTable 개체로 해당 파일을 가져 오거나 사용을 그대로 다음 두 번째 데이터베이스로 엑셀 파일을 가져올 수 있습니다 이 링크를 보라 이 많이 U 도움이 될 수 있습니다.
나는 애드혹 쿼리의 수도 생각 당신은 엑셀 파일에 결과를 내 보낸 다음 DataTable 개체로 해당 파일을 가져 오거나 사용을 그대로 다음 두 번째 데이터베이스로 엑셀 파일을 가져올 수 있습니다 이 링크를 보라 이 많이 U 도움이 될 수 있습니다.
http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html
-
==============================
14.Oracle을 사용하여 (또는 SQL Server에 응용 프로그램을 구성)하는 경우 오라클 SQL Developer는 당신을 위해이 작업을 수행합니다. 테이블의 '언로드'을 선택하고 (모든 테이블이 물건을 만들하지 않으려면을 선택 취소 DDL)를 통해 옵션을 따릅니다.
Oracle을 사용하여 (또는 SQL Server에 응용 프로그램을 구성)하는 경우 오라클 SQL Developer는 당신을 위해이 작업을 수행합니다. 테이블의 '언로드'을 선택하고 (모든 테이블이 물건을 만들하지 않으려면을 선택 취소 DDL)를 통해 옵션을 따릅니다.
-
==============================
15.나는 무료이며, 무엇보다도 정확히이 일을이 SMSMS 부스트 부가 기능을 발견했다. 당신이 바로 결과를 클릭하고 스크립트 데이터를 선택할 수 있습니다.
나는 무료이며, 무엇보다도 정확히이 일을이 SMSMS 부스트 부가 기능을 발견했다. 당신이 바로 결과를 클릭하고 스크립트 데이터를 선택할 수 있습니다.
-
==============================
16.당신은 무료 및 오픈 소스이 Q2C.SSMSPlugin를 사용할 수 있습니다. 당신은 마우스 오른쪽 버튼을 클릭하고 "쿼리에 명령 ... 실행 -> 쿼리에 삽입 ..."를 선택할 수 있습니다. 즐겨)
당신은 무료 및 오픈 소스이 Q2C.SSMSPlugin를 사용할 수 있습니다. 당신은 마우스 오른쪽 버튼을 클릭하고 "쿼리에 명령 ... 실행 -> 쿼리에 삽입 ..."를 선택할 수 있습니다. 즐겨)
-
==============================
17.나는 다음과 같은 절차를 만들어 :
나는 다음과 같은 절차를 만들어 :
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;
-
==============================
18.당신은 테이블에 선택 쿼리의 결과를 삽입하기 위해, INSERT INTO SELECT 문을 사용할 수 있습니다. http://www.w3schools.com/sql/sql_insert_into_select.asp
당신은 테이블에 선택 쿼리의 결과를 삽입하기 위해, 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';
from https://stackoverflow.com/questions/4526461/converting-select-results-into-insert-script-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 가입에서 SQL : 그것은 가능한 한 모든 열을 접두사로 '접두사 *.'? (0) | 2020.06.20 |
---|---|
[SQL] T-SQL에서 테이블 변수를 통해 할 수 있습니까 루프? (0) | 2020.06.20 |
[SQL] UTF8으로 라틴 데이터를 변환 MYSQL (0) | 2020.06.20 |
[SQL] 어떻게 각 키 값에 대한 가장 최근의 타임 스탬프 행을 선택할 수 있습니까? (0) | 2020.06.20 |
[SQL] MySQL의 GROUP BY 두 개의 열 (0) | 2020.06.20 |