Làm cách nào tôi có thể tạo tập lệnh INSERT cho bảng SQL Server hiện có bao gồm tất cả các hàng được lưu trữ?


226

Tôi đang tìm cách tạo tập lệnh "Tạo và chèn tất cả các hàng" với SQL Management Studio 2008 R2.

Tôi biết rằng tôi có thể tạo một tập lệnh "tạo bảng".

Tôi cũng có thể tạo tập lệnh "chèn vào", nhưng điều đó sẽ chỉ tạo một hàng duy nhất với trình giữ chỗ.

Có cách nào để tạo tập lệnh chèn chứa tất cả các hàng hiện được lưu trữ không?


Câu trả lời:


406

Có, nhưng bạn sẽ cần chạy nó ở cấp cơ sở dữ liệu.

Nhấp chuột phải vào cơ sở dữ liệu trong SSMS, chọn "Nhiệm vụ", "Tạo tập lệnh ...". Khi bạn hoàn thành công việc, bạn sẽ đến phần "Tùy chọn tập lệnh". Nhấp vào "Nâng cao" và trong danh sách bật lên, trong đó ghi "Các loại dữ liệu theo tập lệnh", bạn đã có tùy chọn để chọn Dữ liệu và / hoặc Lược đồ.

Ảnh chụp màn hình của Tùy chọn kịch bản nâng cao


Đã trả lời ở trên. Xin lỗi về bài viết quá sớm. Không chắc chắn những gì đã đi sai!
Thomas Rushton

1
Đẹp! Tôi đã từng dựa vào addin của Gói công cụ, như gbn đề xuất, cho loại nhiệm vụ này. Vui mừng khi biết tôi không cần nó nữa.
ivanmp

31
Đó là một tùy chọn ẩn IMHO. Nên rõ ràng hơn ... :)
Leniel Maccaferri

Cảm ơn, Thomas. Thật là hoàn hảo!
Kate

29

Kịch bản lệnh này tạo ra các câu lệnh chèn dữ liệu hiện có của bạn. Đây là một thủ tục được lưu trữ mà bạn cần phải chạy một lần và sau đó nó được thiết kế riêng cho bạn.

Tôi đã cố gắng tìm loại công cụ này trong một thời gian nhưng không hài lòng với kết quả, vì vậy tôi đã viết thủ tục lưu trữ này.

Thí dụ:

Exec [dbo].[INS]  'Dbo.test where 1=1'

(1) Đây dbolà lược đồ và kiểm tra là tablename và 1=1là điều kiện.

Exec [dbo].[INS]  'Dbo.test where name =''neeraj''' * for string

(2) Đây dbolà lược đồ và kiểm tra là tablename và name='neeraj'là điều kiện.

Đây là thủ tục lưu trữ

/*
Authore : neeraj prasad sharma (please dont remove this :))
Example (1) Exec [dbo].[INS]  'Dbo.test where 1=1'
        (2) Exec [dbo].[INS]  'Dbo.test where name =''neeraj''' * for string

here Dbo is schema and test is tablename and 1=1 is condition

*/


CREATE procedure  [dbo].[INS]                              
(                                                          
   @Query  Varchar(MAX)                                                          
)                              

AS                              

SET nocount ON                  

DECLARE @WithStrINdex as INT                            
DECLARE @WhereStrINdex as INT                            
DECLARE @INDExtouse as INT                            

DECLARE @SchemaAndTAble VArchar(270)                            
DECLARE @Schema_name  varchar(30)                            
DECLARE @Table_name  varchar(240)                            
DECLARE @Condition  Varchar(MAX)                             

SET @WithStrINdex=0                            

SELECT @WithStrINdex=CHARINDEX('With',@Query )                            
, @WhereStrINdex=CHARINDEX('WHERE', @Query)                            

IF(@WithStrINdex!=0)                            
SELECT @INDExtouse=@WithStrINdex                            
ELSE                            
SELECT @INDExtouse=@WhereStrINdex                            

SELECT @SchemaAndTAble=Left (@Query,@INDExtouse-1)                                                     
SELECT @SchemaAndTAble=Ltrim (Rtrim( @SchemaAndTAble))                            

SELECT @Schema_name= Left (@SchemaAndTAble, CharIndex('.',@SchemaAndTAble )-1)                            
,      @Table_name = SUBSTRING(  @SchemaAndTAble , CharIndex('.',@SchemaAndTAble )+1,LEN(@SchemaAndTAble) )                            

,      @CONDITION=SUBSTRING(@Query,@WhereStrINdex+6,LEN(@Query))--27+6                            


DECLARE @COLUMNS  table (Row_number SmallINT , Column_Name VArchar(Max) )                              
DECLARE @CONDITIONS as varchar(MAX)                              
DECLARE @Total_Rows as SmallINT                              
DECLARE @Counter as SmallINT              

DECLARE @ComaCol as varchar(max)            
SELECT @ComaCol=''                   

SET @Counter=1                              
SET @CONDITIONS=''                              

INSERT INTO @COLUMNS                              
SELECT Row_number()Over (Order by ORDINAL_POSITION ) [Count], Column_Name 
FROM INformation_schema.columns 
WHERE Table_schema=@Schema_name AND table_name=@Table_name         


SELECT @Total_Rows= Count(1) 
FROM @COLUMNS                              

SELECT @Table_name= '['+@Table_name+']'                      

SELECT @Schema_name='['+@Schema_name+']'                      

While (@Counter<=@Total_Rows )                              
begin                               
--PRINT @Counter                              

SELECT @ComaCol= @ComaCol+'['+Column_Name+'],'            
FROM @COLUMNS                              
WHERE [Row_number]=@Counter                          

SELECT @CONDITIONS=@CONDITIONS+ ' + Case When ['+Column_Name+'] is null then ''Null'' Else '''''''' + Replace( Convert(varchar(Max),['+Column_Name+']  ) ,'''''''',''''  ) +'''''''' end+'+''','''                                                     
FROM @COLUMNS                              
WHERE [Row_number]=@Counter                              

SET @Counter=@Counter+1                              

End                              

SELECT @CONDITIONS=Right(@CONDITIONS,LEN(@CONDITIONS)-2)                              

SELECT @CONDITIONS=LEFT(@CONDITIONS,LEN(@CONDITIONS)-4)              
SELECT @ComaCol= substring (@ComaCol,0,  len(@ComaCol) )                            

SELECT @CONDITIONS= '''INSERT INTO '+@Schema_name+'.'+@Table_name+ '('+@ComaCol+')' +' Values( '+'''' + '+'+@CONDITIONS                              

SELECT @CONDITIONS=@CONDITIONS+'+'+ ''')'''                              

SELECT @CONDITIONS= 'Select  '+@CONDITIONS +'FRom  ' +@Schema_name+'.'+@Table_name+' With(NOLOCK) ' + ' Where '+@Condition                              
print(@CONDITIONS)                              
Exec(@CONDITIONS)  

Đó là một kịch bản rất hữu ích. Có cách nào dễ dàng để thay đổi định dạng Ngày tháng, vì vậy, nó xuất ngày theo định dạng chuẩn, chẳng hạn như "2014 / 03-31 23:55:41"? Hiện tại tôi đang nhận được các datetimes như "Feb 10 2010 2:44 PM".
ChrisGuest

Có vẻ như bạn phải bỏ phần CHỌN TỪ và cũng tháo các dấu ngoặc vuông để cho XUÂN hoạt động.
Corgalore

Kiểm tra cột tính toán là không có. Lỗi sẽ đến nếu bảng của bạn có bất kỳ cột tính toán nào
vicky

câu trả lời tuyệt vời cảm ơn bạn Neeraj, những lỗi nhỏ đối với tôi "INform_schema" phải là "THÔNG TIN_SCHema" và "DECLARE Điều kiện Varchar (MAX)" nên là "
KHAI THÁC

17

Có, sử dụng bổ trợ Gói công cụ SSMS thương mại nhưng không tốn kém có tính năng "Tạo câu lệnh Chèn từ kết quả, bảng hoặc cơ sở dữ liệu" tiện lợi


10
Không còn miễn phí cho phiên bản 2012.
CJM

5

Chỉ để chia sẻ, tôi đã phát triển kịch bản của riêng mình để làm điều đó. Hãy sử dụng nó. Nó tạo ra các câu lệnh "CHỌN" mà sau đó bạn có thể chạy trên các bảng để tạo ra các câu lệnh "INSERT".

select distinct 'SELECT ''INSERT INTO ' + schema_name(ta.schema_id) + '.' + so.name + ' (' + substring(o.list, 1, len(o.list)-1) + ') VALUES ('
+ substring(val.list, 1, len(val.list)-1) + ');''  FROM ' + schema_name(ta.schema_id) + '.' + so.name + ';'
from    sys.objects so
join sys.tables ta on ta.object_id=so.object_id
cross apply
(SELECT '  ' +column_name + ', '
 from information_schema.columns c
 join syscolumns co on co.name=c.COLUMN_NAME and object_name(co.id)=so.name and OBJECT_NAME(co.id)=c.TABLE_NAME and co.id=so.object_id and c.TABLE_SCHEMA=SCHEMA_NAME(so.schema_id)
 where table_name = so.name
 order by ordinal_position
FOR XML PATH('')) o (list)
cross apply
(SELECT '''+' +case
         when data_type = 'uniqueidentifier' THEN 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '])+'''''''' END '
         WHEN data_type = 'timestamp' then '''''''''+CONVERT(NVARCHAR(MAX),CONVERT(BINARY(8),[' + COLUMN_NAME + ']),1)+'''''''''
         WHEN data_type = 'nvarchar' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+REPLACE([' + COLUMN_NAME + '],'''''''','''''''''''')+'''''''' END'
         WHEN data_type = 'varchar' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+REPLACE([' + COLUMN_NAME + '],'''''''','''''''''''')+'''''''' END'
         WHEN data_type = 'char' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+REPLACE([' + COLUMN_NAME + '],'''''''','''''''''''')+'''''''' END'
         WHEN data_type = 'nchar' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+REPLACE([' + COLUMN_NAME + '],'''''''','''''''''''')+'''''''' END'
         when DATA_TYPE='datetime' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '],121)+'''''''' END '
         when DATA_TYPE='datetime2' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '],121)+'''''''' END '
         when DATA_TYPE='geography' and column_name<>'Shape' then 'ST_GeomFromText(''POINT('+column_name+'.Lat '+column_name+'.Long)'') '
         when DATA_TYPE='geography' and column_name='Shape' then '''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '])+'''''''''
         when DATA_TYPE='bit' then '''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '])+'''''''''
         when DATA_TYPE='xml' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+REPLACE(CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + ']),'''''''','''''''''''')+'''''''' END '
         WHEN DATA_TYPE='image' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),CONVERT(VARBINARY(MAX),[' + COLUMN_NAME + ']),1)+'''''''' END '
         WHEN DATA_TYPE='varbinary' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '],1)+'''''''' END '
         WHEN DATA_TYPE='binary' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '],1)+'''''''' END '
         when DATA_TYPE='time' then 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE ''''''''+CONVERT(NVARCHAR(MAX),[' + COLUMN_NAME + '])+'''''''' END '
         ELSE 'CASE WHEN [' + column_name+'] IS NULL THEN ''NULL'' ELSE CONVERT(NVARCHAR(MAX),['+column_name+']) END' end
   + '+'', '
 from information_schema.columns c
 join syscolumns co on co.name=c.COLUMN_NAME and object_name(co.id)=so.name and OBJECT_NAME(co.id)=c.TABLE_NAME and co.id=so.object_id and c.TABLE_SCHEMA=SCHEMA_NAME(so.schema_id)
 where table_name = so.name
 order by ordinal_position
FOR XML PATH('')) val (list)
where   so.type = 'U'
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.