回転:役に立つSQLコード
20682 ワード
テーブルのデータからSQLスクリプトを生成し、クエリー・アナライザでこれらのスクリプトを実行した後、自動的にSQL Serverにデータをインポートする機能です.
ストアド・プロシージャの呼び出し:
結果セットは次のようになります.
-- =============================================
-- Author:
-- Description: Insert
--
-- =============================================
CREATE PROCEDURE sp_ConvertDataToInsertSql
@tablename sysname -- source table name
AS
BEGIN
DECLARE @column varchar(1000)
DECLARE @columndata varchar(1000)
DECLARE @sql varchar(4000)
DECLARE @xtype tinyint
DECLARE @name sysname
DECLARE @objectId int
DECLARE @objectname sysname
DECLARE @ident int
SET NOCOUNT ON
SET @objectId=object_id(@tablename)
--
IF @objectId IS NULL
BEGIN
print @tablename + ' '
RETURN
END
SET @objectname=RTRIM(object_name(@objectId))
IF @objectname IS NULL OR CHARINDEX(@objectname,@tablename) = 0
BEGIN
print @tablename + ' '
RETURN
END
--
IF OBJECTPROPERTY(@objectId,'IsTable') <> 1
BEGIN
print @tablename + ' '
RETURN
END
SELECT @ident=status&0x80
FROM syscolumns
WHERE id=@objectid
AND status&0x80=0x80
IF @ident IS NOT NULL
PRINT 'SET IDENTITY_INSERT '+ @TableName + ' ON'
-- , Insert
DECLARE syscolumns_cursor CURSOR FOR
SELECT c.name,c.xtype FROM syscolumns c
WHERE c.id=@objectid
ORDER BY c.colid
--
open syscolumns_cursor
SET @column=''
SET @columndata=''
FETCH NEXT FROM syscolumns_cursor INTO @name, @xtype
WHILE @@fetch_status <> -1
BEGIN
IF @@fetch_status <> -2
BEGIN
--timestamp ,image,text,ntext,sql_variant
IF @xtype NOT IN(189,34,35,99,98)
BEGIN
SET @column=@column +
CASE WHEN len(@column)=0 THEN '' ELSE ',' END + @name
SET @columndata = @columndata +
CASE WHEN len(@columndata)=0 THEN '' ELSE ','','',' END +
CASE WHEN @xtype IN(167,175) THEN '''''''''+' + @name+'+''''''''' --varchar,char
WHEN @xtype IN(231,239) THEN '''N''''''+' + @name+'+''''''''' --nvarchar,nchar
WHEN @xtype=61 THEN '''''''''+convert(char(23),' + @name+',121)+''''''''' --datetime
WHEN @xtype=58 THEN '''''''''+convert(char(16),' + @name+',120)+''''''''' --smalldatetime
WHEN @xtype=36 THEN '''''''''+convert(char(36),' + @name+')+''''''''' --uniqueidentifier
ELSE @name
END
END
END
FETCH NEXT FROM syscolumns_cursor INTO @name,@xtype
END
--
CLOSE syscolumns_cursor
DEALLOCATE syscolumns_cursor
SET @sql = 'SET NOCOUNT ON SELECT ''INSERT '
+ @tablename + '(' + @column + ') VALUES(''as ''--'','
+ @columndata + ','')'' FROM ' + @tablename
PRINT '--'+@sql
EXEC(@sql)
IF @ident IS NOT NULL
PRINT 'SET IDENTITY_INSERT '+@TableName+' OFF'
END
ストアド・プロシージャの呼び出し:
EXEC sp_ConvertDataToInsertSql 'persons'
結果セットは次のようになります.
INSERT persons(username,lastname,firstname,city,id) VALUES('Bill','Bill','Zheng','Xuzhou',1)