선택 결과를 삽입 스크립트로 변환하는 중 - 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_name
from [... 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
'bestsource' 카테고리의 다른 글
@selector() in Swift? (0) | 2023.05.24 |
---|---|
각 2의 ngClass 내부 동적 클래스 이름 (0) | 2023.05.24 |
jQuery에서 속성 추가 (0) | 2023.05.24 |
파이썬에서 긴 f-string을 분할하려면 어떻게 해야 합니까? (0) | 2023.05.24 |
Mongodb - 조건부인 경우 집계 $push (0) | 2023.05.24 |