내가 가진 SQL Server 2008
, SQL Server Management Studio를.
Table1
database1 에서 데이터를 선택해야 합니다. 그런 다음 결과와 insert values into Table1
database2 의 일부 값을 편집해야 합니다.
아니면 다른 식으로 말하겠습니다.
한 테이블의 데이터를 insert script
.
내가 가진 SQL Server 2008
, SQL Server Management Studio를.
Table1
database1 에서 데이터를 선택해야 합니다. 그런 다음 결과와 insert values into Table1
database2 의 일부 값을 편집해야 합니다.
아니면 다른 식으로 말하겠습니다.
한 테이블의 데이터를 insert script
.
답변:
SSMS Toolpack ( 맥주에서와 같이 무료 )에는 테이블에서 INSERT 문 을 생성 하는 등 다양한 기능 이 있습니다.
업데이트 : SQL Server Management Studio 2012 (및 최신 버전)의 경우 SSMS 도구 팩은 더 이상 무료가 아니지만 적당한 라이선스 비용이 필요합니다.
다음은 일부 상황에서 플러그인이나 외부 도구를 설치하는 것보다 더 쉬울 수있는 또 다른 방법입니다.
select [whatever you need]
INTO temp.table_name
from [... etc ...]
temp.table_name
"개체 선택"화면에서 선택 하고 다음을 클릭합니다.INSERT
문이 새 쿼리 창에 나타나는지 확인합니다.[temp.table_name]
에 [your_table_name]
.drop table [temp.table_name]
.temp
여기서는 액세스 할 수있는 모든 스키마를 나타냅니다. 하나를 생성 ( create schema temp
) 한 다음 완료되면 제거하거나 (더 나은) 현재 작업중인 스키마를 사용하면됩니다.
SSMS에서 :
데이터베이스> 작업> 스크립트 생성을 마우스 오른쪽 버튼으로 클릭합니다.
다음
"특정 데이터베이스 개체 선택"을 선택하고 스크립팅 할 테이블을 확인하고 다음
Advanced >
옵션 목록을 클릭 하고 아래로 스크롤하여 "스크립트로 작성할 데이터 유형"을 찾아 "데이터 전용"> 확인으로 변경합니다.
"새 쿼리 창에 저장"> 다음> 다음> 마침을 선택합니다.
이제 180 개의 모든 행이 180 개의 insert 문으로 작성되었습니다!
기본 방법 :
예를 들어 테이블이있는 경우
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---
C) 기존 테이블에서 위의 데이터를 얻으려면 출력이 위의 스크립트와 같은 형식이되도록 선택 쿼리를 작성해야합니다.
D) 그런 다음 마지막으로 실행시 삽입 스크립트를 생성하는 최종 스크립트를 만들기 위해 위의 변수를 연결했습니다.
이자형)
@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()
함수는 따옴표 안에 열 데이터를 감싸는 데 사용됩니다.
H) ISNULL
는 어떤 행에 NULL
열에 대한 데이터가 있으면 쿼리가 실패하고 반환 NULL
하기 때문에 사용됩니다.ISNULL
나는) 그리고 sp_generate_insertscripts
같은 sp 를 만들었습니다.
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
Visual Studio 를 통해 가능합니다. SQL Server 개체 탐색기 .
필요한 테이블을 보려면 컨텍스트 메뉴에서 "데이터보기"를 클릭하고 결과를 필터링하고 결과를 스크립트로 저장할 수 있습니다.
Visual Studio를 사용하여 다음을 수행하십시오.
SQL Server-> SQL Server 데이터베이스 프로젝트 유형의 프로젝트 만들기
SQL Server 탐색기 CTL- \, CTL-S를 엽니 다.
SQL SERVER 아이콘을 마우스 오른쪽 버튼으로 클릭하여 SQL Server를 추가합니다. Selcet 새 서버 추가
관심있는 테이블로 이동
오른쪽 클릭-> 데이터보기
왼쪽 상단 셀을 클릭하여 모든 것을 강조 표시합니다 (ctl-A가 작동하지 않는 것 같습니다).
오른쪽 클릭-> SCript
이것은 훌륭합니다. 나는 수년에 걸쳐 위에 나열된 모든 것을 시도했습니다. 나는 이것을 할 수있는 도구가 있다는 것을 알고 있으며 훨씬 더 많은 이름을 생각할 수 없습니다. 그러나 그것은 매우 비싸다.
행운을 빕니다. 나는 이것을 알아 냈다. 텍스트 필드 등으로 광범위하게 테스트하지는 않았지만 길을 먼 길로 인도하는 것처럼 보입니다.
그렉
SSMS에서 'Result to File'옵션을 선택하고 선택한 결과를 파일로 내보내고 결과 파일을 변경 한 다음 마지막으로 BCP-Bulk copy를 사용하여 데이터베이스 2의 표 1에 삽입 할 수 있습니다.
대량 삽입의 경우 .rpt 파일을 .csv 파일로 변환해야한다고 생각합니다.
도움이되기를 바랍니다.
비슷한 문제가 있었지만 쿼리 (필터 등)에서 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을 사용하면 초가 손실됩니다.
이것은보다 다재다능한 솔루션 (질문이 묻는 것보다 조금 더 많은 일을 할 수 있음)이며, 새로운 저장 프로 시저를 만들지 않고도 쿼리 창에서 사용할 수 있습니다. 쓰기 액세스 권한이없는 프로덕션 데이터베이스에서 유용합니다. .
코드를 사용하려면 사용법을 설명하는 인라인 주석에 따라 수정하십시오. 그런 다음 쿼리 창에서이 쿼리를 실행하면 필요한 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
가져 오기 및 내보내기 작업을 위해 특별히 설계된 Sql 서버 통합 서비스 패키지를 사용할 수 있습니다. .
VS에는 Sql Server를 완전히 설치 한 경우 이러한 패키지를 개발하기위한 패키지가 있습니다.
임시 쿼리를 사용하여 결과를 Excel 파일로 내 보낸 다음 해당 파일을 데이터 테이블 개체로 가져 오거나 그대로 사용하고 두 번째 데이터베이스로 Excel 파일을 가져올 수도 있다고 생각합니다.이 링크를 보면 도움이 될 수 있습니다. 많이.
http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html
다음을 만들었습니다 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;
Oracle을 사용하는 경우 (또는 SQL Server에 응용 프로그램을 구성하는 경우) Oracle SQL Developer가이 작업을 수행합니다. 테이블에 대해 '언로드'를 선택하고 옵션을 따르십시오 (모든 테이블이 항목을 생성하지 않으려면 DDL을 선택 취소하십시오).
나는이 SMSMS Boost 애드온을 찾았 는데 , 이것은 무료이며 다른 것들 중에서도 정확하게 이것을 수행합니다. 결과를 마우스 오른쪽 버튼으로 클릭하고 데이터 스크립트를 선택할 수 있습니다.
무료 오픈 소스 인 이 Q2C.SSMSPlugin을 사용할 수 있습니다 . 마우스 오른쪽 버튼을 클릭하고 "명령에 대한 쿼리 실행 ...-> 삽입 할 쿼리 ..."를 선택할 수 있습니다. 즐겨)
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';