Chuyển đổi kết quả Chọn thành Chèn tập lệnh - SQL Server [đóng]


106

Tôi có SQL Server 2008, SQL Server Management Studio.

Tôi cần chọn dữ liệu từ Table1trong cơ sở dữ liệu1. Sau đó, tôi phải chỉnh sửa một số giá trị trong kết quả và insert values into Table1trong cơ sở dữ liệu2.

Hoặc để tôi nói theo cách khác.

Làm cách nào để chuyển đổi dữ liệu trong một bảng thành insert script.


Các cơ sở dữ liệu có trên cùng một máy chủ không? Nếu vậy, bạn có thể chèn từ cái này vào cái kia. Chèn vào database2.dbo.myTable chọn dữ liệu từ database1.dbo.anOtherTable
u07ch

Có, cả hai cơ sở dữ liệu đều nằm trên cùng một máy chủ. Nhưng tôi cần kịch bản. Tôi sẽ đưa các tập lệnh này cho anh chàng cơ sở dữ liệu của chúng tôi.
Captain Comic

Nó sẽ giúp làm rõ câu hỏi. Bất kỳ cách tiếp cận nào sẽ hoạt động hay bạn cần một tập lệnh chèn mà bạn có thể giao cho dba của mình?
greg

Câu trả lời:


31

SSMS Toolpack ( MIỄN PHÍ như trong bia) có nhiều tính năng tuyệt vời - bao gồm tạo các câu lệnh INSERT từ các bảng.

Cập nhật: đối với SQL Server Management Studio 2012 (và mới hơn), SSMS Toolpack không còn miễn phí nhưng yêu cầu một khoản phí cấp phép khiêm tốn.


+1 @marc_s Tôi đã làm rất nhiều công việc tạo ra các tập lệnh chèn như vậy mà không sử dụng các tập lệnh trình tạo T-SQL và bây giờ bạn cho tôi biết rằng có một công cụ.
bernd_k

Hãy cẩn thận khi các bảng lưu trữ dữ liệu tiền . Những kiểu dữ liệu có thể lưu trữ chữ số thập phân hơn được hiển thị bình thường hoặc trong kịch bản được tạo ra bởi SSMS Toolpack
bernd_k

13
Điều này không còn miễn phí nữa. ssmstoolspack.com/Licensing
greg

@Greg: cảm ơn vì đã chỉ ra điều đó. Lưu ý: việc cấp phép đó chỉ áp dụng cho SQL Server Management Studio 2012 và mới hơn - đối với các phiên bản trước đó, gói công cụ vẫn miễn phí.
marc_s

4
Thay thế cho SSMS Toolpack ?
Kiquenet

154

Đây là một phương pháp khác, có thể dễ dàng hơn so với việc cài đặt plugin hoặc công cụ bên ngoài trong một số trường hợp:

  • Làm một .select [whatever you need]INTO temp.table_namefrom [... etc ...]
  • Nhấp chuột phải vào cơ sở dữ liệu trong Object Explorer => Tasks => Generate Scripts
  • Chọn temp.table_nametrong màn hình "Chọn đối tượng", nhấp vào Tiếp theo.
  • Trong màn hình "Chỉ định cách lưu tập lệnh":
    • Nhấp vào Nâng cao, tìm thuộc tính "Loại dữ liệu thành tập lệnh", chọn "Chỉ dữ liệu", đóng thuộc tính nâng cao.
    • Chọn "Lưu vào cửa sổ truy vấn mới" (trừ khi bạn có hàng nghìn bản ghi).
  • Nhấp vào Tiếp theo, đợi công việc hoàn thành, quan sát các INSERTcâu lệnh kết quả xuất hiện trong cửa sổ truy vấn mới.
  • Sử dụng Tìm & Thay thế để thay đổi tất cả [temp.table_name]thành [your_table_name].
  • drop table [temp.table_name].

Sử dụng INTO temp.table1 tạo ra lỗi sau: Tên lược đồ được chỉ định "tạm thời" hoặc không tồn tại hoặc bạn không có quyền sử dụng nó. Tôi đang sử dụng SQL 2012.
Đánh dấu

3
tempở đây đề cập đến bất kỳ lược đồ nào bạn có quyền truy cập. Bạn có thể tạo một ( create schema temp) và sau đó xóa nó khi bạn hoàn thành, hoặc (tốt hơn) chỉ cần sử dụng bất kỳ lược đồ nào bạn hiện đang làm việc.
KT.

1
Cảm ơn bạn vì điều này, tôi biết phải có một cách! Nhân tiện, bạn có thể bỏ qua việc tạo bảng tạm thời nếu bạn chỉ cần toàn bộ dữ liệu từ bảng mà bạn muốn tập lệnh.
FAB

Tôi đã phải sử dụng điều này để nhập dữ liệu vào Cơ sở dữ liệu Azure. Nhập nó vào một cơ sở dữ liệu không phải phương trời sau đó trích xuất dưới dạng chèn SQL.
m12lrpv

2
Tôi vẫn ngạc nhiên rằng SSMS đã không thêm khả năng này 'xem đầu ra dưới dạng tập lệnh chèn' trên các tập kết quả .. nhưng cách tiếp cận trên hoạt động, mặc dù nó tạo ra các lệnh chèn riêng lẻ thay vì thực hiện chèn hàng loạt thích hợp (giả sử 1.000 mục mỗi lần chèn ) thích thì phải. Điều này có thể mất mãi mãi để chạy trên bộ kết quả thực sự lớn
Traderhut Games

60

Trong SSMS:

  • Nhấp chuột phải vào cơ sở dữ liệu> Nhiệm vụ> Tạo tập lệnh

  • Kế tiếp

  • Chọn "Chọn các đối tượng cơ sở dữ liệu cụ thể" và kiểm tra bảng bạn muốn theo tập lệnh, Tiếp theo

  • Nhấp vào Advanced >danh sách các tùy chọn, cuộn xuống dưới cùng và tìm "Loại dữ liệu thành tập lệnh" và thay đổi thành "Chỉ dữ liệu"> OK

  • Chọn "Lưu vào cửa sổ truy vấn mới"> Tiếp theo> Tiếp theo> Kết thúc

Tất cả 180 hàng hiện được viết dưới dạng 180 câu lệnh chèn!


12
Hữu ích cho vài hàng. Không hữu ích : Nếu một bảng có 20000 hàng và tôi chỉ muốn 20 lần chèn cho 20 hàng.
Kiquenet,

2
@Kiquenet - Trước tiên, bạn có thể tạo Chế độ xem chọn 20 hàng mong muốn của bạn, sau đó làm theo các bước sau để tạo các tập lệnh chèn dựa trên Chế độ xem. Sau đó, bạn có thể thực hiện tìm kiếm hàng loạt và thay thế để thay đổi tên Chế độ xem trở lại bất kỳ tên Bảng nào bạn cần chèn vào.
tember

@ Tháng Chín Nó không hoạt động trên Chế độ xem như bạn nói, nhưng nó CÓ trong Visual Studio: trước tiên bạn tạo một chế độ xem với lựa chọn bắt buộc trong sql studio, sau đó mở Visual Studio, kết nối với máy chủ sql và tạo tập lệnh trên chế độ xem đã tạo đó.
Sergii

Cảm ơn bạn đã thông tin đó. Mặc dù đổ toàn bộ bảng là quá mức cần thiết, nhưng nó đã giải quyết được vấn đề của tôi.
paulz 19/07/19

Tiết kiệm cuộc sống. Tôi viết kịch bản cả đời.
Jay

38

Phương pháp gốc :

ví dụ nếu bạn có bàn

Users(Id, name)

Bạn có thể làm được việc này:

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

Bạn có thể làm theo cách này, nhưng nếu bạn có nhiều hơn một vài bảng thì sẽ hơi khó gõ. Có những sp được viết và có thể tìm thấy trên google để làm điều này cho bạn, hoặc nếu bạn có VS2012, bạn có thể nhờ VS làm điều đó cho bạn. Xem câu trả lời của tôi dưới đây.
greg

1
Hữu ích cho các bảng có ít trường. Nếu một bảng có 50, 60, 100 cột không hữu ích. Tốt hơn hệ mã SQL
Kiquenet

23

1- Giải thích về Scripts

A) Cú pháp để chèn dữ liệu trong bảng như sau

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) Để lấy dữ liệu trên từ bảng hiện có, chúng ta phải viết truy vấn chọn theo cách mà đầu ra sẽ có dạng như các tập lệnh trên

D) Sau đó, cuối cùng tôi có biến Concatenated ở trên để tạo tập lệnh cuối cùng sẽ tạo tập lệnh chèn khi thực thi

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

F) Và cuối cùng đã thực hiện truy vấn trên EXECUTE(TEXT)

QUOTENAME()Hàm G) được sử dụng để bọc dữ liệu cột bên trong dấu ngoặc kép

H) ISNULLđược sử dụng bởi vì nếu bất kỳ hàng nào có NULL dữ liệu cho bất kỳ cột nào, truy vấn không thành công và trả về đó là NULLlý do tại sao để tránh điều đó tôi đã sử dụngISNULL

I) Và tạo ra các sp sp_generate_insertscripts giống nhau

1- Chỉ cần đặt tên bảng mà bạn muốn insert script

2- Lọc điều kiện nếu bạn muốn kết quả cụ thể

----------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

Bạn thực hiện một công việc tuyệt vời ...
DineshDB

14

Có thể thực hiện thông qua Visual Studio SQL Server Object Explorer.

Bạn có thể nhấp vào "Xem dữ liệu" từ menu ngữ cảnh để có bảng cần thiết, lọc kết quả và lưu kết quả dưới dạng tập lệnh.


1
Bài đăng của bạn là cách chính xác và dễ dàng nhất bằng cách sử dụng Công cụ dữ liệu SQL Server trong Visual Studio, đâyđây là bài đăng giải thích cách tạo câu lệnh chèn cho 1000 hàng đầu tiên, hy vọng sẽ hữu ích.
shaijut

8

Sử dụng studio trực quan, hãy làm như sau

Tạo dự án kiểu SQL Server -> Dự án cơ sở dữ liệu SQL Server

mở trình khám phá máy chủ sql CTL- \, CTL-S

thêm SQL Server bằng cách nhấp chuột phải vào biểu tượng SQL SERVER. Selcet THÊM MÁY CHỦ MỚI

điều hướng xuống bảng bạn quan tâm

nhấp chuột phải -> XEM DỮ LIỆU

Nhấp vào ô trên cùng bên trái để đánh dấu mọi thứ (ctl-A dường như không hoạt động)

Nhấp chuột phải -> SCript

Điều này là tuyệt vời. Tôi đã thử mọi thứ được liệt kê ở trên trong nhiều năm. Tôi biết có một công cụ ngoài kia sẽ làm được điều này và nhiều hơn thế nữa, tôi không thể nghĩ ra tên của nó. Nhưng nó rất đắt.

Chúc may mắn. Tôi chỉ tìm ra điều này. Chưa thử nghiệm nó rộng rãi với các trường văn bản, v.v., nhưng có vẻ như nó sẽ giúp bạn đi một chặng đường dài.

Greg


1
Điều này không chuyển đổi các kết quả được chọn, nó chỉ đơn giản là viết ra bảng.
Eric K

@QuantumDynamix - câu hỏi ban đầu được làm rõ ở phía dưới bằng cách 'Làm cách nào để chuyển đổi dữ liệu trong một bảng thành tập lệnh.' Dưới đây là một ví dụ về cách tiếp cận của tôi. Nó chính xác là những gì người dùng yêu cầu. Trên thực tế, đó là giải pháp duy nhất mà tôi thấy thực sự tạo ra một tập lệnh chèn, như người dùng yêu cầu. Tại sao lại ủng hộ? 'Doesnt chuyển đổi kết quả được chọn' có nghĩa là gì? SET IDENTITY_INSERT [PMDB]. [BUAttr] BẬT CHÈN VÀO [PMDB]. [BUAttr] ([id], [BU], [Name], [Value]) GIÁ TRỊ (1, N'ALASKA ', N'GeoCenter Lat' , N'67.07213 ')
greg

điều này cùng với việc tạo bảng tạm thời, đã làm điều đó cho tôi
hr-tis

4

Tạo một bảng riêng biệt bằng cách sử dụng thành câu lệnh Ví dụ:

Chọn * vào Test_123 từ [dbo]. [Nhân viên] trong đó Tên như '% Test%'

Đi tới Cơ sở dữ liệu Nhấp chuột phải vào Cơ sở dữ liệu Nhấp vào Tạo tập lệnh Chọn bảng của bạn Chọn tùy chọn advanace và chọn Thuộc tính "Chỉ dữ liệu" Chọn tệp "mở trong truy vấn mới"

Sql sẽ tạo script cho bạn


3

Bạn có thể Chọn tùy chọn 'Kết quả đến Tệp' trong SSMS và xuất kết quả đã chọn của bạn sang tệp và thực hiện các thay đổi trong tệp kết quả và cuối cùng sử dụng BCP - Bản sao hàng loạt, bạn có thể chèn vào bảng 1 trong cơ sở dữ liệu 2.

Tôi nghĩ rằng để chèn hàng loạt, bạn phải chuyển đổi tệp .rpt thành tệp .csv

Hy vọng nó sẽ giúp ích.


2

Tôi đã gặp sự cố tương tự, nhưng tôi cần có thể tạo câu lệnh INSERT từ một truy vấn (với bộ lọc, v.v.)

Vì vậy, tôi đã tạo quy trình sau:

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

Sau đó, bạn có thể sử dụng nó bằng cách ghi kết quả truy vấn của bạn vào một bảng tạm thời và chạy thủ tục:

-- 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'

Lưu ý: Thủ tục này chỉ truyền các giá trị vào một chuỗi có thể khiến dữ liệu trông hơi khác một chút. Với DATETIME chẳng hạn, giây sẽ bị mất.


2

Đây là một giải pháp linh hoạt hơn (có thể làm nhiều hơn một chút so với câu hỏi yêu cầu) và có thể được sử dụng trong cửa sổ truy vấn mà không cần phải tạo một proc mới được lưu trữ - hữu ích trong cơ sở dữ liệu sản xuất, chẳng hạn như nơi bạn không có quyền ghi .

Để sử dụng mã, vui lòng sửa đổi theo các chú thích bên trong giải thích cách sử dụng của nó. Sau đó, bạn có thể chỉ cần chạy truy vấn này trong một cửa sổ truy vấn và nó sẽ in các câu lệnh INSERT mà bạn yêu cầu.

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


1

Tôi nghĩ rằng nó cũng có thể với các truy vấn adhoc, bạn có thể xuất kết quả sang tệp excel và sau đó nhập tệp đó vào đối tượng dữ liệu của bạn hoặc sử dụng nó như vậy và sau đó nhập tệp excel vào cơ sở dữ liệu thứ hai. Hãy xem liên kết này, điều này có thể giúp bạn rất nhiều.

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


1

Tôi đã tạo như sau 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

Sau đó, bạn có thể sử dụng nó theo cách đó:

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;

Đầu ra sẽ là một cái gì đó như thế:

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

Nếu bạn chỉ muốn nhận một phạm vi hàng, hãy sử dụng @toptham số dưới đây:

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;

Nó hữu ích nhưng nó đã cắt ngắn trường này "6C2A94737A456C405FDCF793DFA6E661: BqRc / DpUIe27" thành "6C2A94737A456C405FDCF793DFA6E6"
Adam Mendoza

0

Nếu bạn đang sử dụng Oracle (hoặc định cấu hình ứng dụng cho SQL Server) thì Oracle SQL Developer thực hiện việc này cho bạn. chọn 'dỡ bỏ' cho một bảng và làm theo các tùy chọn thông qua (bỏ chọn DDL nếu bạn không muốn tất cả bảng tạo ra nội dung).


1
Đây được đánh dấu rõ ràng là một câu hỏi SQL Server ...
BentOnCoding

Cũng có thể sử dụng nhà phát triển sql oracle với máy chủ sql. Tôi đã chỉnh sửa câu trả lời của mình.
Liam

0

Tôi đã tìm thấy tiện ích bổ sung SMSMS Boost này , miễn phí và thực hiện chính xác điều này trong số những thứ khác. Bạn có thể nhấp chuột phải vào kết quả và chọn Dữ liệu tập lệnh làm.


Tôi xem dữ liệu lưới Script nhưng không tạo ra SQL Insert từ kết quả
Kiquenet

0

Bạn có thể sử dụng Q2C.SSMSPlugin này , miễn phí và mã nguồn mở. Bạn có thể nhấp chuột phải và chọn "Execute Query To Command ... -> Query To Insert ...". Thưởng thức)


Hợp lệ cho SSMS 2012?
Kiquenet

-1

Bạn có thể sử dụng một INSERT INTO SELECT câu lệnh để chèn kết quả của một truy vấn chọn vào một bảng. http://www.w3schools.com/sql/sql_insert_into_select.asp

Thí dụ:

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

1
Điều này không liên quan gì đến kết quả từ câu lệnh SELECT chuyển đổi thành câu lệnh INSERT Đây chỉ là câu lệnh INSERT thuần túy.
Niels Lucas

Nó không tương đương về mặt chức năng?
Người bảo vệ một
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.