Select sonuçlarını Komut Ekle'ye dönüştürme - SQL Server [kapalı]


107

SQL Server 2008SQL Server Management Studio'ya sahibim .

Table1Veritabanından veri seçmem gerekiyor1 . Sonra sonuçlarda ve insert values into Table1veritabanı2'de bazı değerleri düzenlemem gerekiyor .

Ya da başka bir şekilde ifade etmeme izin verin.

Bir tablodaki verileri insert script.


Veritabanları aynı sunucuda mı? Eğer öyleyse, birinden diğerine ekleyebilirsiniz. Database2.dbo.myTable'a ekle veri
tabanı1.dbo'dan

Evet, her iki veritabanı da aynı sunucuda. Ama senaryoya ihtiyacım var. Bu komut dosyalarını veri tabanı görevlimize vereceğim.
Captain Comic

Soruyu netleştirmeye yardımcı olur. Herhangi bir yaklaşım işe yarayacak mı veya dba'nıza teslim edebileceğiniz bir ekleme komut dosyasına ihtiyacınız var mı?
greg

Yanıtlar:


31

SSMS Toolpack ( birada olduğu gibi ÜCRETSİZDİR ) çeşitli harika özelliklere sahiptir - tablolardan INSERT ifadeleri oluşturmak dahil .

Güncelleme: SQL Server Management Studio 2012 (ve daha yenisi) için, SSMS Toolpack artık ücretsiz değildir, ancak makul bir lisans ücreti gerektirir.


+1 @marc_s T-SQL oluşturucu betiklerini ortadan kaldıran bu tür insert betikleri oluşturmak için çok çalıştım ve şimdi bana bir araç olduğunu söylüyorsunuz.
bernd_k

Tablolar para verilerini depoladığında dikkatli olun . Bu veri türleri, normalde görüntülenenden veya SSMS Toolpack tarafından oluşturulan komut dosyalarından daha fazla ondalık basamak depolayabilir.
bernd_k

13
Bu artık ücretsiz değil. ssmstoolspack.com/Licensing
greg

@Greg: Bunu belirttiğiniz için teşekkürler. Not: lisanslama yalnızca SQL Server Management Studio 2012 ve daha yeni sürümler için geçerlidir - önceki sürümler için araç paketi hala ücretsizdir.
marc_s

4
SSMS Toolpack'e alternatif mi?
Kiquenet

160

İşte bazı durumlarda eklentileri veya harici araçları yüklemekten daha kolay olabilecek başka bir yöntem:

  • Bir .select [whatever you need]INTO temp.table_namefrom [... etc ...]
  • Object Explorer => Tasks => Generate Scripts içindeki veritabanına sağ tıklayın
  • "Select temp.table_nameObjects" ekranında seçin, Next'e tıklayın.
  • "Komut dosyalarının nasıl kaydedileceğini belirtin" ekranında:
    • Gelişmiş'i tıklayın, "Komut Dosyasına Veri Türleri" özelliğini bulun, "Yalnızca veri" öğesini seçin, gelişmiş özellikleri kapatın.
    • "Yeni sorgu penceresine kaydet" i seçin (binlerce kaydınız yoksa).
  • İleri'ye tıklayın, işin tamamlanmasını bekleyin, ortaya çıkan INSERTifadelerin yeni bir sorgu penceresinde göründüğünü izleyin.
  • Tümünü [temp.table_name]olarak değiştirmek için Bul ve Değiştir'i kullanın [your_table_name].
  • drop table [temp.table_name].

INTO temp.table1'i kullanmak aşağıdaki hatayı oluşturur: Belirtilen şema adı "temp" ya yok ya da kullanma izniniz yok. Ben SQL 2012. kullanıyorum
Mark

3
tempburada erişiminiz olan herhangi bir şemayı ifade eder. Ya bir tane oluşturabilir ( create schema temp) ve işiniz bittiğinde onu kaldırabilir ya da (daha iyisi) şu anda çalışmakta olduğunuz şemayı kullanabilirsiniz.
KT.

1
Bunun için teşekkür ederim, bir yolu olması gerektiğini biliyordum! Bu arada, komut dosyası oluşturmak istediğiniz tablodaki tüm verilere ihtiyacınız varsa, geçici tablo oluşturmayı atlayabilirsiniz.
FAB

Verileri bir Azure Veritabanına aktarmak için bunu kullanmak zorunda kaldım. Gök mavisi olmayan bir veritabanına aktarın ve ardından SQL eklemeleri olarak çıkarın.
m12lrpv

2
SSMS'nin bu 'çıktıyı komut dosyası olarak görüntüle' yeteneğini sonuç kümelerine eklememiş olması beni hala şaşırtıyor .. ancak yukarıdaki yaklaşım işe yarıyor, ancak uygun bir toplu ekleme yapmak yerine ayrı ekleme komutları oluşturuyor (örneğin her ekleme için 1000 öğe ) olması gerektiği gibi. Bunun gerçekten büyük sonuç kümelerinde
koşması

60

SSMS'de:

  • Veritabanına sağ tıklayın> Görevler> Komut Dosyaları Oluştur

  • Sonraki

  • "Belirli veritabanı nesnelerini seçin" i seçin ve komut dosyası oluşturulmasını istediğiniz tabloyu kontrol edin.

  • Advanced >Seçenekler listesini tıklayın , aşağı kaydırın ve "Kodlanacak veri türleri" ni bulun ve "Yalnızca Veri"> Tamam olarak değiştirin

  • "Yeni sorgu penceresine kaydet"> İleri> İleri> Son'u seçin

180 satırın tümü artık 180 ekleme ifadesi olarak yazılıyor!


12
Birkaç sıra için kullanışlıdır. Yararlı değil : Bir tabloda 20000 satır varsa ve ben 20 satır için yalnızca 20 ekleme istiyorum.
Kiquenet

2
@Kiquenet - Önce istediğiniz 20 satırı seçen bir Görünüm oluşturabilir, ardından Görünüme dayalı ekleme komut dosyalarını oluşturmak için bu adımları uygulayabilirsiniz. Daha sonra, Görünüm adını eklemek istediğiniz Tablo adına geri döndürmek için toplu bulma ve değiştirme yapabilirsiniz.
tember

@tember Dediğin gibi View üzerinde çalışmıyor ama Visual Studio'da YAPIYOR: önce sql studio'da gerekli seçim ile bir view oluşturursunuz, sonra Visual Studio'yu açarsınız, sql server'a bağlanır ve o oluşturulan view üzerinde script üretirsiniz.
Sergii

Bu bilgi için teşekkür ederim. Masanın tamamını çöpe atmak abartı olsa da sorunumu çözdü.
paulz

Hayat kurtarıcı. Hayatım boyunca senaryo yazıyorum.
Jay

39

Yerel yöntem :

örneğin masanız varsa

Users(Id, name)

Bunu yapabilirsiniz:

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

Bunu bu şekilde yapabilirsiniz, ancak birkaç tablonuzdan fazlasına sahipseniz, biraz yazı yazabilirsiniz. Google'da bunu sizin için yapan yazılı ve bulunabilir sps var veya VS2012'niz varsa VS'nin sizin için yapmasını sağlayabilirsiniz. Aşağıdaki cevabıma bakın.
greg

1
Az alanlı tablolar için kullanışlıdır. Bir tabloda 50, 60, 100 sütun varsa kullanışlı değildir. Daha iyi nesil SQL kodu
Kiquenet

24

1- Komut Dosyalarının Açıklaması

A) Tabloya veri eklemek için sözdizimi aşağıdaki gibidir

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) Mevcut tablodan yukarıdaki verileri almak için, seçme sorgusunu çıktının yukarıdaki komut dosyaları biçiminde olacak şekilde yazmamız gerekir.

D) Sonra Son olarak, yürütme sırasında ekleme komut dosyası oluşturacak son komut dosyası oluşturmak için yukarıdaki değişkeni birleştirdim

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) Ve Sonunda Yukarıdaki sorguyu yürüttü EXECUTE(TEXT)

G) QUOTENAME()işlevi, sütun verilerini tırnak içine almak için kullanılır

H) ISNULLkullanılır çünkü herhangi bir satırda NULL herhangi bir sütun için veri varsa , sorgu başarısız olur ve NULLbu yüzden kullanmamın nedeni budurISNULL

I) Ve sp'yi sp_generate_insertscripts aynı şekilde yarattı

1- Sadece istediğiniz tablo adını yazınız insert script

2- Belirli sonuçlar istiyorsanız durumu filtreleyin

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

Harika bir iş çıkardınız ...
DineshDB

14

Visual Studio ile yapmak mümkündür SQL Server Nesne Gezgini .

Gerekli tablo için bağlam menüsünden "Verileri Görüntüle" yi tıklayabilir, sonuçları filtreleyebilir ve sonucu kod olarak kaydedebilirsiniz.


1
Gönderiniz, Visual Studio'da SQL Server Veri Araçlarını kullanarak doğru ve en kolay yoldur, burada ve burada , ilk 1000 satır için insert ifadesinin nasıl oluşturulacağını açıklayan bir gönderi, umarız yardımcı olur.
shaijut

8

Görsel stüdyoyu kullanarak aşağıdakileri yapın

SQL Server -> SQL Server Veritabanı Projesi türünde bir proje oluşturun

sql sunucu gezginini açın CTL- \, CTL-S

SQL SERVER simgesine sağ tıklayarak bir SQL Server ekleyin. Selcet YENİ SUNUCU EKLE

ilgilendiğiniz tabloya gidin

sağ tıklayın -> VERİLERİ GÖRÜNTÜLE

Her şeyi vurgulamak için sol üst hücreyi tıklayın (ctl-A çalışmıyor gibi görünüyor)

Sağ Tık -> Senaryo

Bu harika. Yıllar boyunca yukarıda listelenen her şeyi denedim. Bunu ve daha fazlasını yapacak bir araç olduğunu biliyorum, adını düşünemiyorum. Ama çok pahalıdır.

İyi şanslar. Bunu şimdi anladım. Bunu metin alanları vb. İle kapsamlı bir şekilde test etmedim, ancak size yolun aşağısında uzun bir yol kat edecek gibi görünüyor.

Greg


1
Bu, seçilen sonuçları dönüştürmez, yalnızca tablonun komut dosyasını oluşturur.
Eric K

@QuantumDynamix - Asıl soru, alt kısımda 'Bir tablodaki verileri bir betiğe nasıl dönüştürebilirim' ile açıklanmıştır. Aşağıda yaklaşımımın bir örneği var. Tam olarak kullanıcının istediği buydu. Aslında, kullanıcının sorduğu gibi, aslında bir ekler komut dosyası ürettiğini gördüğüm tek çözüm bu. Neden olumsuz oy? 'Seçili sonuçları dönüştürmüyor' ne anlama geliyor? KİMLİK_INSERT [PMDB] AYARLA. [BUAttr] INSERT ON [PMDB]. [BUAttr] ([id], [BU], [Ad], [Değer]) DEĞERLER (1, N'ALASKA ', N'GeoCenter Lat' , N'67.07213 ')
greg

bu geçici tabloları oluşturmakla birlikte, benim için yaptım
harishr

4

İnto ifadesini kullanarak ayrı bir tablo oluşturun Örneğin

[Dbo] 'dan Test_123'e * öğesini seçin. [Çalışan] burada Ad'% Test% 'gibi

Veritabanına Git Veritabanına Sağ Tıkla Komut Dosyası Oluştur'a tıklayın Tablonuzu seçin Gelişmiş seçeneğini seçin ve "Yalnızca Veri" Özniteliğini seçin "Yeni sorguda aç" dosyasını seçin

Sql sizin için komut dosyası oluşturacak


3

SSMS'de 'Result to File' seçeneğini seçebilir ve seçim sonucunuzu dosyaya aktarabilir ve değişikliklerinizi sonuç dosyasında yapabilir ve son olarak BCP - Toplu kopya kullanarak veritabanı 2'deki tablo 1'e ekleyebilirsiniz.

Toplu ekleme için .rpt dosyasını .csv dosyasına dönüştürmeniz gerektiğini düşünüyorum.

Umarım yardımcı olur.


2

Benzer bir sorun yaşadım, ancak bir sorgudan (filtrelerle vb.) INSERT ifadesi oluşturabilmem gerekiyordu.

Bu yüzden aşağıdaki prosedürü oluşturdum:

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

Daha sonra sorgunuzun çıktısını geçici bir tabloya yazıp yordamı çalıştırarak kullanabilirsiniz:

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

Not: Bu prosedür, değerleri yalnızca verilerin biraz farklı görünmesine neden olabilecek bir dizeye çevirir. Örneğin DATETIME ile saniyeler kaybedilecektir.


2

Bu daha çok yönlü bir çözümdür (sorunun sorduğundan biraz daha fazlasını yapabilir) ve yeni bir depolanmış işlem oluşturmanıza gerek kalmadan bir sorgu penceresinde kullanılabilir - örneğin yazma erişiminizin olmadığı üretim veritabanlarında kullanışlıdır .

Kodu kullanmak için lütfen kullanımını açıklayan satır içi yorumlara göre değişiklik yapın. Daha sonra bu sorguyu bir sorgu penceresinde çalıştırabilirsiniz ve ihtiyacınız olan INSERT ifadelerini yazdıracaktır.

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

Aşağıdakileri yarattım 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

O zaman bu şekilde kullanabilirsiniz:

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;

Çıktı şöyle bir şey olurdu:

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

Yalnızca bir dizi satır elde etmek istiyorsanız, @topparametreyi aşağıdaki gibi kullanın :

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;

Yardımcı oldu, ancak bu alanı "6C2A94737A456C405FDCF793DFA6E661: BqRc / DpUIe27" olarak kısaltarak yalnızca "6C2A94737A456C405FDCF793DFA6E6"
Adam Mendoza

0

Oracle kullanıyorsanız (veya uygulamayı SQL Sunucusuna yapılandırıyorsanız), Oracle SQL Developer bunu sizin için yapar. Bir tablo için 'boşalt'ı seçin ve seçenekleri izleyin (tüm tablonun bir şeyler oluşturmasını istemiyorsanız DDL işaretini kaldırın).


1
Bu açıkça bir SQL Server sorusu olarak işaretlenmiştir ...
BentOnCoding

Oracle sql developer'ı sql server ile kullanmak da mümkündür. Cevabımı düzenledim.
Liam

0

Ücretsiz olan bu SMSMS Boost eklentisini buldum ve diğer şeylerin yanı sıra tam olarak bunu yapıyor. Sonuçlara sağ tıklayıp Komut dosyası verilerini şu şekilde seçebilirsiniz.


Ben görüntülemek Senaryo ızgara verileri ancak sonuçlarından SQL yerleştirin oluşturmaz
Kiquenet

0

Ücretsiz ve açık kaynak olan bu Q2C.SSMSPlugin'i kullanabilirsiniz . Sağ tıklayıp "Komut için Sorguyu Çalıştır ... -> Eklenecek Sorgu ..." öğesini seçebilirsiniz. Zevk almak)


SSMS 2012 için geçerli mi?
Kiquenet

-1

INSERT INTO SELECTBir seçme sorgusunun sonuçlarını bir tabloya eklemek için bir ifade kullanabilirsiniz . http://www.w3schools.com/sql/sql_insert_into_select.asp

Misal:

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

1
Bunun, INSERT deyimlerine dönüştürülen bir SELECT deyiminin sonucuyla ilgisi yoktur. Bu sadece düz INSERT deyimidir.
Niels Lucas

İşlevsel olarak eşdeğer değil mi?
Koruyucu 1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.