2010-07-20 24 views
3

我知道你可以創建一個腳本使用複製表:創建腳本來複製表及其內容?

右鍵單擊表>腳本表爲>創造>新的查詢編輯器窗口

但我怎麼能生成一個包含了一堆的腳本爲表中的每一行插入命令?

Table1 
Id1, Row1 
Id2, Row2 
Id3, Row3 

Insert into Table1 values(Row1); 
Insert into Table1 values(Row2); 
Insert into Table1 values(Row3); 

回答

1

最後我做這個

右擊數據庫>任務>生成腳本...>選擇表>中的高級選項我設置「數據類型腳本」,以「架構和數據」

1
Select 
    'Insert into Table (
    IntField1 
    StringField2 
    Column3) 
    values (' + 
    IntField1 + ',' + 
    + '''' + StringField2 + ''',' + 
    Column2 + ')' as InsertQuery 
From Table 

這樣的事情,只記得,如果你的字符串中包含一個單引號,你需要確保你更換這樣replace(stringfield, '''', '''''')

+1

也爲空值將是字符串減少到沒什麼,可能希望得到的ISNULL在那裏了。 – FlyingStreudel 2010-07-20 14:30:46

0

假設行是INT NOT NULL。您可以編寫一個輸出SQL的語句SELECT;

SELECT N'INSERT INTO Table1 VALUES (' + CAST(Row AS NVARCHAR(10)) + N');' 
FROM Table1 

然後將您的結果輸出到文本。

0

所以這不是超級漂亮的因爲我有點拿我的sp之一,併爲此入侵它。但基本上這將採取任何表並打印一系列INSERT語句到表名爲tbl_text(你需要創建)

的參數是表名,並從系統對象表ID

--this is how you get the tbl_id 
SELECT id FROM sysobjects WHERE type = 'U' AND name = 'tablename' 


CREATE PROCEDURE dbo.sp_export_table 
@tblhdr varchar(100), 
@tblID varchar(100) 
AS 

SET NOCOUNT ON 

IF object_id('tempdb..##temptable') IS NOT NULL 
BEGIN 
    DROP TABLE ##temptable 
END 

DECLARE @identity bit 
DECLARE @typestmt nvarchar(100) 
DECLARE @typeval int 
DECLARE @rowstmt nvarchar(1000) 
DECLARE @rowID varchar(50) 
DECLARE @orderby nvarchar(100) 
DECLARE @clmnstmt varchar(200) 
DECLARE @clmnhdr varchar(50) 
DECLARE @clmnstring varchar(1000) 
DECLARE @valuestmt nvarchar(200) 
DECLARE @valuestring nvarchar(3000) 
DECLARE @value nvarchar(1000) 
DECLARE @insertstmt varchar(1000) 
DECLARE @params nvarchar(100) 
DECLARE @param2 nvarchar(100) 
SELECT @rowstmt = N'SELECT TOP 1 @inside_var = name FROM syscolumns WHERE id = ' + @tblID + ' ORDER BY colorder' 
SELECT @params = N'@inside_var NVARCHAR(1000) OUTPUT' 
EXEC sp_executesql @rowstmt, @params, @inside_var = @orderby OUTPUT 

SELECT @rowstmt = 'SELECT *, ROW_NUMBER() OVER (ORDER BY ' + @orderby + ') AS row INTO ##temptable FROM ' + @tblhdr 
exec(@rowstmt) 


IF object_id('tempdb..##temptable') IS NOT NULL 
BEGIN 
    DECLARE row_cursor CURSOR FOR 
    SELECT row FROM ##temptable 

    OPEN row_cursor 

    FETCH NEXT FROM row_cursor 
    INTO @rowID 

    --if table has identity and has records write identity_insert on 
    SET @identity = 0 
    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES 
    WHERE OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 
    'TableHasIdentity') = 1 AND TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_NAME = @tblhdr) AND EXISTS(SELECT * FROM ##temptable) 
    BEGIN 
     SET @identity = 1 
     INSERT INTO dbo.tbl_text VALUES('SET IDENTITY_INSERT dbo.' + @tblhdr + ' ON') 
    END 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SELECT @clmnstmt = 'DECLARE column_cursor CURSOR FOR SELECT name FROM syscolumns WHERE id = ' + @tblID + ' ORDER BY colorder' 
     exec(@clmnstmt) 

     OPEN column_cursor 

     FETCH NEXT FROM column_cursor 
     INTO @clmnhdr 

     SELECT @clmnstring = '(' 
     SELECT @valuestring = '(' 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      IF @clmnhdr <> 'row' 
      BEGIN 
       SELECT @clmnstring = @clmnstring + @clmnhdr + ',' 
       SELECT @valuestmt = N'SELECT @inside_var = ' + @clmnhdr + ' FROM ##temptable WHERE row = ' + @rowID 
       EXEC sp_executesql @valuestmt, @params, @inside_var = @value OUTPUT 

       SELECT @typestmt = N'SELECT @inside_var2 = xtype FROM syscolumns WHERE name = ''' + @clmnhdr + ''' AND id = ' + @tblID 
       SELECT @param2 = N'@inside_var2 INT OUTPUT' 
       EXEC sp_executesql @typestmt, @param2, @inside_var2 = @typeval OUTPUT 

       IF @typeval NOT IN (48,52,56,59,60,62,104,108,122,127) 
       BEGIN 
        SET @value = REPLACE(@value,'''','''''') 
        SET @value = '''' + @value + '''' 
        SET @value = ISNULL(@value, '''''') 
       END 

       IF NOT (@typeval = 34) 
       BEGIN 
        SELECT @valuestring = @valuestring + @value + ',' 
       END 
       ELSE 
       BEGIN 
        SELECT @valuestring = @valuestring + '''''' + ',' 
       END 
      END 

      FETCH NEXT FROM column_cursor 
      INTO @clmnhdr 

     END 

     SET @clmnstring = LEFT(@clmnstring, LEN(@clmnstring) - 1) 
     SET @valuestring = LEFT(@valuestring, LEN(@valuestring) - 1) 

     INSERT INTO dbo.tbl_text VALUES('INSERT INTO dbo.' + @tblhdr + ' ' + @clmnstring + ') VALUES' + @valuestring + ')') 


     FETCH NEXT FROM row_cursor 
     INTO @rowID 

     CLOSE column_cursor 
     DEALLOCATE column_cursor 

    END 

    --if it wrote identity_insert on, turn it off 
    IF (@identity = 1) 
    BEGIN 
      INSERT INTO dbo.tbl_text VALUES('SET IDENTITY_INSERT dbo.' + @tblhdr + ' OFF') 
    END 

    CLOSE row_cursor 
    DEALLOCATE row_cursor 
END 

IF object_id('tempdb..##temptable') IS NOT NULL 
BEGIN 
    DROP TABLE ##temptable 
END 

GO