การแปลงผลลัพธ์ที่เลือกเป็นสคริปต์แทรก - SQL Server [ปิด]


107

ฉันมีSQL Server 2008SQL Server Management Studio

ฉันต้องการเลือกข้อมูลจากTable1ในฐานข้อมูล 1 จากนั้นฉันต้องแก้ไขค่าบางอย่างในผลลัพธ์และinsert values into Table1ในฐานข้อมูล 2

หรือให้ฉันใส่วิธีอื่น

ฉันจะแปลงข้อมูลในตารางเดียวเป็นinsert scriptไฟล์.


ฐานข้อมูลอยู่บนเซิร์ฟเวอร์เดียวกันหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถแทรกจากที่หนึ่งไปยังอีกอันหนึ่งได้ แทรกลงใน database2.dbo.myTable เลือกข้อมูลจาก database1.dbo.anOtherTable
u07ch

ใช่ทั้งสองฐานข้อมูลอยู่บนเซิร์ฟเวอร์เดียวกัน แต่ฉันต้องการสคริปต์ ฉันจะให้สคริปต์นี้กับคนที่แต่งตัวประหลาดฐานข้อมูลของเรา
Captain Comic

มันจะช่วยชี้แจงคำถาม วิธีการใด ๆ ที่ใช้งานได้หรือคุณต้องการสคริปต์แทรกที่คุณสามารถส่งมอบให้กับ dba ของคุณได้หรือไม่?
greg

คำตอบ:


31

SSMS Toolpack (ซึ่งฟรีเหมือนในเบียร์) มีคุณสมบัติที่ยอดเยี่ยมมากมาย - รวมถึงการสร้างคำสั่ง INSERTจากตาราง

อัปเดต:สำหรับ SQL Server Management Studio 2012 (และใหม่กว่า) SSMS Toolpack ไม่ฟรีอีกต่อไป แต่ต้องเสียค่าธรรมเนียมการให้สิทธิ์การใช้งานเล็กน้อย


+1 @marc_s ฉันทำงานมากมายในการสร้างสคริปต์แทรกดังกล่าวโดยไม่ใช้สคริปต์ตัวสร้าง T-SQL และตอนนี้คุณบอกฉันว่ามีเครื่องมือ
bernd_k

ระมัดระวังเมื่อตารางเก็บข้อมูลเงิน ประเภทข้อมูลเหล่านี้สามารถจัดเก็บตำแหน่งทศนิยมได้มากกว่าที่แสดงตามปกติหรือในสคริปต์ที่สร้างโดย SSMS Toolpack
bernd_k

13
สิ่งนี้ไม่ฟรีอีกต่อไป ssmstoolspack.com/Licensing
greg

@Greg: ขอบคุณที่ชี้ให้เห็น หมายเหตุ: การให้สิทธิ์การใช้งานใช้กับ SQL Server Management Studio 2012และใหม่กว่าเท่านั้น - สำหรับเวอร์ชันก่อนหน้านี้ชุดเครื่องมือยังคงใช้งานได้ฟรี
marc_s

4
ทางเลือกสำหรับSSMS Toolpack ?
Kiquenet

157

นี่เป็นอีกวิธีหนึ่งซึ่งอาจง่ายกว่าการติดตั้งปลั๊กอินหรือเครื่องมือภายนอกในบางสถานการณ์:

  • ทำ.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].

การใช้ INTO temp.table1 ทำให้เกิดข้อผิดพลาดต่อไปนี้: ไม่มีชื่อ schema ที่ระบุ "temp" หรือคุณไม่ได้รับอนุญาตให้ใช้ ฉันใช้ SQL 2012
ทำเครื่องหมาย

3
tempในที่นี้หมายถึงสคีมาใด ๆ ที่คุณสามารถเข้าถึงได้ คุณสามารถสร้างหนึ่ง ( create schema temp) แล้วลบออกเมื่อคุณทำเสร็จแล้วหรือ (ดีกว่า) เพียงแค่ใช้สคีมาที่คุณกำลังทำงานอยู่
KT

1
ขอบคุณสำหรับสิ่งนี้ฉันรู้ว่าต้องมีทาง! อย่างไรก็ตามคุณสามารถข้ามการสร้างตารางชั่วคราวได้หากคุณต้องการเพียงแค่ข้อมูลทั้งหมดจากตารางที่คุณต้องการเขียนสคริปต์
FAB

ฉันต้องใช้สิ่งนี้เพื่อนำเข้าข้อมูลไปยังฐานข้อมูล Azure นำเข้าสู่ฐานข้อมูลที่ไม่ใช่สีฟ้าจากนั้นแยกเป็นส่วนแทรก SQL
m12lrpv

2
ฉันยังคงทำให้ฉันประหลาดใจที่ SSMS ไม่ได้เพิ่มความสามารถนี้ 'ดูผลลัพธ์เป็นแทรกสคริปต์' ในชุดผลลัพธ์ .. แต่วิธีการข้างต้นใช้งานได้แม้ว่าจะสร้างคำสั่งแทรกแต่ละคำแทนที่จะทำการแทรกจำนวนมากที่เหมาะสม (พูด 1,000 รายการต่อการแทรก ) อย่างที่ควรจะเป็น การดำเนินการนี้อาจใช้เวลาตลอดไปในชุดผลลัพธ์ที่ใหญ่มาก
Traderhut Games

60

ใน SSMS:

  • คลิกขวาที่ฐานข้อมูล> งาน> สร้างสคริปต์

  • ต่อไป

  • เลือก "เลือกวัตถุฐานข้อมูลเฉพาะ" และตรวจสอบตารางที่คุณต้องการเขียนสคริปต์ถัดไป

  • คลิกAdvanced >ในรายการตัวเลือกเลื่อนลงไปด้านล่างและมองหา "ประเภทของข้อมูลเป็นสคริปต์" แล้วเปลี่ยนเป็น "ข้อมูลเท่านั้น"> ตกลง

  • เลือก "บันทึกลงในหน้าต่างการสืบค้นใหม่"> ถัดไป> ถัดไป> เสร็จสิ้น

ตอนนี้ทั้งหมด 180 แถวเขียนเป็นคำสั่งแทรก 180!


12
มีประโยชน์สำหรับไม่กี่แถว ไม่มีประโยชน์ : ถ้าตารางมี 20000 แถวและฉันต้องการเพียง 20 แทรกสำหรับ 20 แถว
Kiquenet

2
@Kiquenet - ก่อนอื่นคุณสามารถสร้าง View ที่เลือก 20 แถวที่คุณต้องการจากนั้นทำตามขั้นตอนต่อไปนี้เพื่อสร้างสคริปต์แทรกตาม View จากนั้นคุณสามารถค้นหาจำนวนมากและแทนที่เพื่อเปลี่ยนชื่อ View กลับเป็นชื่อตารางที่คุณต้องการแทรก
ชั่วคราว

@tember มันใช้ไม่ได้กับ View อย่างที่คุณพูด แต่ทำได้ใน Visual Studio: ก่อนอื่นคุณต้องสร้างมุมมองด้วยการเลือกที่ต้องการใน sql studio จากนั้นเปิด Visual Studio เชื่อมต่อกับเซิร์ฟเวอร์ sql และสร้างสคริปต์ในมุมมองที่สร้างขึ้นนั้น
Sergii

ขอบคุณสำหรับข้อมูลนั้น แม้ว่าการทิ้งทั้งโต๊ะจะเป็นการใช้งานมากเกินไป แต่ก็ช่วยแก้ปัญหาของฉันได้
paulz

เครื่องช่วยชีวิต ฉันเขียนสคริปต์มาตลอดชีวิต
เจ

38

วิธีดั้งเดิม :

เช่นถ้าคุณมีโต๊ะ

Users(Id, name)

คุณสามารถทำได้:

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

คุณสามารถทำได้ด้วยวิธีนี้ แต่ถ้าคุณมีมากกว่าสองสามตารางก็จะต้องพิมพ์เล็กน้อย มี sps ที่เขียนและค้นหาได้ใน Google ที่ทำเพื่อคุณหรือถ้าคุณมี VS2012 คุณสามารถให้ VS ทำเพื่อคุณได้ ดูคำตอบของฉันด้านล่าง
greg

1
มีประโยชน์สำหรับตารางที่มีฟิลด์น้อย ถ้าตารางมี 50, 60, 100 คอลัมน์ไม่มีประโยชน์ โค้ด SQL รุ่นที่
Kiquenet

23

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) ในการรับข้อมูลข้างต้นจากตารางที่มีอยู่เราต้องเขียน Select query ในลักษณะที่ผลลัพธ์จะอยู่ในรูปแบบของสคริปต์ด้านบน

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)

ช)QUOTENAME()ฟังก์ชันใช้เพื่อตัดข้อมูลคอลัมน์ภายในใบเสนอราคา

H) ISNULLถูกใช้เพราะถ้าแถวใดมีNULL ข้อมูลสำหรับคอลัมน์ใด ๆ การสืบค้นจะล้มเหลวและส่งคืนNULLนั่นคือเหตุผลที่ต้องหลีกเลี่ยงที่ฉันใช้ISNULL

I) และสร้าง 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

คุณทำได้ดีมาก ...
DineshDB

14

ทำได้ผ่านVisual Studio SQL Server Object Explorer

คุณสามารถคลิก "ดูข้อมูล" จากเมนูบริบทสำหรับตารางที่จำเป็นกรองผลลัพธ์และบันทึกผลลัพธ์เป็นสคริปต์


1
โพสต์ของคุณเป็นวิธีที่ถูกต้องและง่ายที่สุดโดยใช้ SQL Server Data Tools ใน Visual Studio ที่นี่และนี่คือโพสต์ที่อธิบายวิธีการสร้างคำสั่งแทรกสำหรับ 1,000 แถวแรกหวังว่าจะช่วยได้
shaijut

8

ใช้ Visual Studio ให้ทำดังต่อไปนี้

สร้างโครงการประเภท SQL Server -> SQL Server Database Project

เปิด sql server explorer CTL- \, CTL-S

เพิ่ม SQL Server โดยคลิกขวาที่ไอคอน SQL SERVER Selcet เพิ่มเซิร์ฟเวอร์ใหม่

เลื่อนลงไปที่โต๊ะที่คุณสนใจ

คลิกขวา -> ดูข้อมูล

คลิกเซลล์ด้านซ้ายบนเพื่อเน้นทุกอย่าง (ดูเหมือนว่า ctl-A จะใช้งานไม่ได้)

คลิกขวา -> SCript

นี่มันเยี่ยมมาก ฉันได้ลองทุกอย่างตามรายการข้างต้นในช่วงหลายปีที่ผ่านมา ฉันรู้ว่ามีเครื่องมือที่จะทำสิ่งนี้และอื่น ๆ อีกมากมายนึกชื่อไม่ออก แต่มีราคาแพงมาก

โชคดี. ฉันเพิ่งคิดออก ยังไม่ได้ทดสอบมันอย่างกว้างขวางด้วยช่องข้อความ ฯลฯ แต่ดูเหมือนว่ามันจะทำให้คุณต้องเดินทางไกล

เกร็ก


1
สิ่งนี้ไม่ได้แปลงผลลัพธ์ที่เลือก แต่เพียงแค่เขียนสคริปต์ออกจากตาราง
Eric K

@QuantumDynamix - คำถามเดิมจะชี้แจงที่ด้านล่างโดย 'ฉันจะแปลงข้อมูลในตารางเดียวเป็นสคริปต์ได้อย่างไร' ด้านล่างนี้เป็นตัวอย่างแนวทางของฉัน ตรงตามที่ผู้ใช้ถาม ในความเป็นจริงมันเป็นทางออกเดียวที่ฉันเห็นว่าสร้างสคริปต์แทรกตามที่ผู้ใช้ถาม ทำไมต้องโหวตลง? 'ไม่แปลงผลลัพธ์ที่เลือก' หมายความว่าอย่างไร SET IDENTITY_INSERT [PMDB]. [BUAttr] ON INSERT INTO [PMDB]. [BUAttr] ([id], [BU], [Name], [Value]) VALUES (1, N'ALASKA ', N'GeoCenter Lat' , N'67.07213 ')
greg

สิ่งนี้พร้อมกับการสร้างตารางอุณหภูมิทำเพื่อฉัน
harishr

4

สร้างตารางแยกต่างหากโดยใช้ into statement ตัวอย่างเช่น

เลือก * เป็น Test_123 จาก [dbo] [Employee] โดยที่ชื่อเช่น '% Test%'

ไปที่ฐานข้อมูลคลิกขวาที่ฐานข้อมูลคลิกที่สร้างสคริปต์เลือกตารางของคุณเลือกตัวเลือก advanace และเลือกแอตทริบิวต์ "ข้อมูลเท่านั้น" เลือกไฟล์ "เปิดในแบบสอบถามใหม่"

Sql จะสร้างสคริปต์ให้คุณ


3

คุณสามารถเลือกตัวเลือก 'ผลลัพธ์เป็นไฟล์' ใน SSMS และส่งออกผลลัพธ์ที่คุณเลือกไปยังไฟล์และทำการเปลี่ยนแปลงในไฟล์ผลลัพธ์และสุดท้ายใช้ BCP - สำเนาจำนวนมากที่คุณสามารถแทรกในตาราง 1 ในฐานข้อมูล 2

ฉันคิดว่าสำหรับการแทรกจำนวนมากคุณต้องแปลงไฟล์. rpt เป็นไฟล์. csv

หวังว่ามันจะช่วยได้


2

ฉันมีปัญหาที่คล้ายกัน แต่ฉันต้องสามารถสร้างคำสั่ง 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 เช่นวินาทีจะหายไป


2

นี่เป็นโซลูชันที่หลากหลายกว่า (ซึ่งทำได้มากกว่าที่คำถามถามเล็กน้อย) และสามารถใช้ในหน้าต่างแบบสอบถามได้โดยไม่ต้องสร้าง proc ที่จัดเก็บใหม่ซึ่งมีประโยชน์ในฐานข้อมูลการผลิตเช่นที่คุณไม่มีสิทธิ์เขียน .

หากต้องการใช้รหัสโปรดแก้ไขตามความคิดเห็นในบรรทัดซึ่งอธิบายการใช้งาน จากนั้นคุณสามารถเรียกใช้แบบสอบถามนี้ในหน้าต่างแบบสอบถามและจะพิมพ์คำสั่ง 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

1

คุณสามารถใช้Sql Server Integration Service Packages ที่ออกแบบมาโดยเฉพาะสำหรับการนำเข้าและส่งออกนำเข้าและส่งออกการดำเนินงาน

VS มีแพ็คเกจสำหรับพัฒนาแพ็คเกจเหล่านี้หากคุณติดตั้ง Sql Server อย่างสมบูรณ์

บริการบูรณาการใน Business Intelligence Development Studio


1

ฉันคิดว่ามันเป็นไปได้ด้วยการสืบค้น adhoc คุณสามารถส่งออกผลลัพธ์ไปยังไฟล์ excel จากนั้นนำเข้าไฟล์นั้นไปยังวัตถุที่สามารถจัดเก็บข้อมูลได้ของคุณหรือใช้มันตามที่เป็นอยู่แล้วนำเข้าไฟล์ excel ไปยังฐานข้อมูลที่สองดูที่ลิงค์นี้ซึ่งสามารถช่วยคุณได้ มาก.

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


1

ฉันสร้างสิ่งต่อไปนี้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;

ช่วยได้ แต่จะตัดฟิลด์นี้ "6C2A94737A456C405FDCF793DFA6E661: BqRc / DpUIe27" ให้เหลือเพียง "6C2A94737A456C405FDCF793DFA6E6"
Adam Mendoza

0

หากคุณใช้ Oracle (หรือกำหนดค่าแอปพลิเคชันเป็น SQL Server) Oracle SQL Developer จะดำเนินการให้คุณ เลือก 'ยกเลิกการโหลด' สำหรับตารางและทำตามตัวเลือกผ่าน (ยกเลิกการเลือก DDL หากคุณไม่ต้องการให้ตารางทั้งหมดสร้างสิ่งต่างๆ)


1
เห็นได้ชัดว่าเป็นคำถาม SQL Server ...
BentOnCoding

นอกจากนี้ยังสามารถใช้นักพัฒนา oracle sql กับเซิร์ฟเวอร์ sql ฉันแก้ไขคำตอบของฉันแล้ว
Liam

0

ฉันพบโปรแกรมเสริม SMSMS Boostนี้ซึ่งฟรีและทำสิ่งนี้ได้ทุกอย่าง คุณสามารถคลิกขวาที่ผลลัพธ์และเลือกข้อมูลสคริปต์เป็น


ฉันดูข้อมูลตารางสคริปต์แต่ไม่สร้าง SQL Insert จากผลลัพธ์
Kiquenet


-1

คุณสามารถใช้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';

1
สิ่งนี้ไม่เกี่ยวข้องกับผลลัพธ์จากคำสั่ง SELECT ที่แปลงเป็นคำสั่ง INSERT นี่เป็นเพียงคำสั่ง INSERT ธรรมดา
Niels Lucas

มันไม่เทียบเท่าหน้าที่หรือไม่?
ผู้พิทักษ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.