SQL Server根據表或視圖批量生成插入語句並BCP導出成文本

--聲明變量
 DECLARE @TableName VARCHAR(100),@RunStr VARCHAR(MAX),@RunRC VARCHAR(MAX),@FinalRun VARCHAR(MAX)
 
 --在master庫創建數據載體,也可以建立在其他數據庫,但一定要是實體表,因爲BCP導出不支持臨時表
 IF OBJECT_ID('master.dbo.tempinsertstr') IS NOT NULL DROP TABLE master.dbo.tempinsertstr
 CREATE TABLE master.dbo.tempinsertstr(rowid INT IDENTITY(0,1),rowtext VARCHAR(MAX))
 INSERT master.dbo.tempinsertstr(rowtext) VALUES('reserved')
 
 --表或視圖名稱定義:
 SELECT @TableName='Reseller'
 
 --拼湊表或視圖字段信息,針對字符或時間類型的加單引號'',爲防止特殊字段名都加了[]
 SELECT @RunStr=ISNULL(@RunStr+'+'',''+','')+'ISNULL('+CASE WHEN T.name IN('nvarchar','varchar','char','text','datetime','date','datetime2') THEN 
 '''''''''+LTRIM('+CASE WHEN T.name='text' THEN 'CAST(['+c.name+'] as varchar(max)))+'''''''',''NULL'')' ELSE '['+c.name+'])+'''''''',''NULL'')' END 
 ELSE  'LTRIM(['+c.name+']),''NULL'')'  END  FROM dbo.syscolumns C
 INNER JOIN dbo.systypes T on C.xusertype=T.xusertype WHERE C.id = object_id(@TableName)
 AND (OBJECTPROPERTY(C.id, N'IsUserTable') = 1 OR OBJECTPROPERTY(C.id,N'IsView')=1) ORDER BY C.colorder
 
 --生成批量values語句:
 SET @RunRC=LOWER(' insert master.dbo.tempinsertstr(rowtext)
 select '+'''(''+'+@RunStr+'+''),'''+' from '+@TableName)
 
 --生成單條插入語句:
 --SET @RunStr=LOWER('
 --select '+'''insert into '+@TableName+' values(''+'+@RunStr+'+'');'''+' from '+@TableName) 
 --EXEC master.dbo.PrintLongText @RunStr
 --EXEC master.dbo.PrintLongText @RunRC
 
 EXEC(@RunRC)
 
 --最後一段去除分號;信息
 UPDATE master.dbo.tempinsertstr SET rowtext=STUFF(rowtext,LEN(rowtext),1,';') WHERE rowid=(SELECT MAX(rowid) FROM master.dbo.tempinsertstr)
 
 --首行rowtext爲reserved更新爲insert into ... values語句:
 UPDATE master.dbo.tempinsertstr SET rowtext='insert into '+LOWER(@TableName)+' values' WHERE rowid=0
 
 --執行BCP導出爲txt文本命令
 SELECT @FinalRun='
 EXEC master..xp_cmdshell ''BCP "select rowtext from master.dbo.tempinsertstr" queryout E:\txt_test\'+@TableName+'.sql -c -t "," -T -C''
 '
 
 EXEC(@FinalRun)
 
 DROP TABLE master.dbo.tempinsertstr;
 
 --以上代碼編譯成函數,可以多加一個打印sql的參數,便於調試
 --參數1:表名或視圖名 參數2:BCP導出txt文本所要輸出路徑 參數3:默認0爲直接執行,1只打印要執行的sql,不執行代碼
 --EXEC usp_TableBatchInsert 'tablename','E:\txt_test\',1
 
 --附上超長文本打印存儲過程:
 CREATE PROC [dbo].[PrintLongText](@SQL VARCHAR(MAX))  
AS  
DECLARE @PrintText VARCHAR(8000) = ''  
WHILE LEN(@SQL) > 4000  
BEGIN  
 --修正末尾是空格出現的bug 
 SELECT @PrintText = LEFT(@SQL, 4000) + '|' 
 SELECT @PrintText = LEFT(@PrintText, LEN(@PrintText) - CHARINDEX(CHAR(10), REVERSE(@PrintText)))  
 SELECT @SQL = RIGHT(@SQL, LEN(@SQL) - LEN(@PrintText))  
  
 SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-2) 
 WHERE RIGHT(@PrintText,2) IN (CHAR(13)+CHAR(10), CHAR(10)+CHAR(13))  
 
 SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-1) 
 WHERE RIGHT(@PrintText,1) IN (CHAR(13),CHAR(10))  
 --SELECT @PrintText=RIGHT(@PrintText,LEN(@PrintText)-1) WHERE LEFT(@PrintText,1) IN (CHAR(13),CHAR(10))  
  
 PRINT @PrintText  
   
 --PRINT '/*** len=' + cast(len(@PrintText) as varchar) + ' datalength=' + cast(datalength(@PrintText) as varchar) + '***/'  
END  
SELECT @PrintText=@SQL  
SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-2) WHERE RIGHT(@PrintText,2) IN (CHAR(13)+CHAR(10), CHAR(10)+CHAR(13))  
SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-1) WHERE RIGHT(@PrintText,1) IN (CHAR(13),CHAR(10))  
SELECT @PrintText=RIGHT(@PrintText,LEN(@PrintText)-1) WHERE LEFT(@PrintText,1) IN (CHAR(13),CHAR(10))  
PRINT @PrintText  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章