我知道你可以創建一個腳本使用複製表:創建腳本來複製表及其內容?
右鍵單擊表>腳本表爲>創造>新的查詢編輯器窗口
但我怎麼能生成一個包含了一堆的腳本爲表中的每一行插入命令?
Table1
Id1, Row1
Id2, Row2
Id3, Row3
Insert into Table1 values(Row1);
Insert into Table1 values(Row2);
Insert into Table1 values(Row3);
我知道你可以創建一個腳本使用複製表:創建腳本來複製表及其內容?
右鍵單擊表>腳本表爲>創造>新的查詢編輯器窗口
但我怎麼能生成一個包含了一堆的腳本爲表中的每一行插入命令?
Table1
Id1, Row1
Id2, Row2
Id3, Row3
Insert into Table1 values(Row1);
Insert into Table1 values(Row2);
Insert into Table1 values(Row3);
最後我做這個
右擊數據庫>任務>生成腳本...>選擇表>中的高級選項我設置「數據類型腳本」,以「架構和數據」
Select
'Insert into Table (
IntField1
StringField2
Column3)
values (' +
IntField1 + ',' +
+ '''' + StringField2 + ''',' +
Column2 + ')' as InsertQuery
From Table
這樣的事情,只記得,如果你的字符串中包含一個單引號,你需要確保你更換這樣replace(stringfield, '''', '''''')
假設行是INT NOT NULL
。您可以編寫一個輸出SQL的語句SELECT
;
SELECT N'INSERT INTO Table1 VALUES (' + CAST(Row AS NVARCHAR(10)) + N');'
FROM Table1
然後將您的結果輸出到文本。
所以這不是超級漂亮的因爲我有點拿我的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
如果您已經在SSC上獲得了一個帳戶,你c使用我去年發佈的腳本。它可以在沒有光標的情況下工作,並且可以自定義過濾
http://www.sqlservercentral.com/scripts/Script+Data/65998/
希望這有助於
也爲空值將是字符串減少到沒什麼,可能希望得到的ISNULL在那裏了。 – FlyingStreudel 2010-07-20 14:30:46