簡體   English   中英

以CSV格式導出數據表SQL Server 2008

[英]Export a data table in CSV format sql server 2008

我需要創建一個存儲過程,該存儲過程查詢表並在指定目錄位置為該數據創建一個CSV文件。

我該怎么做?

您不能直接使用存儲過程來做到這一點。 建議您在SQL Server Management Studio中右鍵單擊數據庫,然后選擇“導出數據”。

向其提供查詢或返回行的存儲過程。 告訴它您希望文件用逗號分隔並用引號引起來的文本限定。

當向導詢問您是否要執行或保存它時,將其保存到磁盤。

這產生了一個稱為SSIS包的東西。 然后,您可以使用Windows資源管理器來運行它,或使用名為dtexec.exe的命令行程序來運行帶有參數的文件,或者將其交給DBA以使其在SQL Server中運行。

您可以通過exec xp_cmdshell'bcp dbname..table out filename.bcp .....'調用BCP。

除了要導入外,這是一個非常相似的問題。 使用bcp將CSV文件導入到SQL 2005或2008

有關BCP的更多信息,請參見此處。

可以這樣做,但是您需要具有足夠的權限才能運行xp_cmdshell和臨時分布式查詢。

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
DECLARE @OutputPath VARCHAR(1000)
SET @OutputPath = 'd:\temp\'
DECLARE @OutputFilename VARCHAR(1000)
DECLARE @ServerName VARCHAR(1000)
SET @ServerName='servername'
DECLARE @Username VARCHAR(50)
SET @Username = 'username'
DECLARE @Password VARCHAR(50)
SET @Password = 'password'
DECLARE @DatabaseName VARCHAR(50)
SET @DatabaseName = 'databasename'
DECLARE @Dsn VARCHAR(1000)
SET @Dsn = 'Server='+@ServerName+';Database='+@DatabaseName+';Uid='+@Username+';Pwd='+@Password+';'

DECLARE @StartProcedureTime DATETIME
DECLARE @EndProcedureTime DATETIME
DECLARE @TimeTaken INTEGER 
DECLARE @QueryToRun VARCHAR(1000)
DECLARE @Query VARCHAR(1000)
DECLARE @result INT

SET @Query = 'mkdir "' + @OutputPath + @DatabaseName +'\"'
EXEC @result = [master]..xp_cmdshell @Query

DECLARE db_cursor CURSOR FOR
SELECT
 T.[FileName] + '.csv' AS [FileName],
 REPLACE(T.SqlToRun, '''', '''''') AS [SqlToRun]
FROM
(
 SELECT 'sp_DataGenerator_AverageRatingAverage' AS [FileName], 'exec sp_DataGenerator_AverageRatingAverage 54' AS [SqlToRun]
 UNION ALL
 SELECT 'sp_DataGenerator_AverageRatingGood', 'exec sp_DataGenerator_AverageRatingGood ''01-01-2009'', ''01-01-2010'''
 UNION ALL
 SELECT 'sp_DataGenerator_AverageRatingBad', 'exec sp_DataGenerator_AverageRatingBad ''01-01-2009'', ''01-01-2010'''
) AS T

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @OutputFilename, @QueryToRun
WHILE @@FETCH_STATUS = 0
BEGIN
 SET @Query = 'bcp "SELECT * FROM OPENROWSET (''SQLOLEDB'','''+@Dsn+''','''+@QueryToRun+''') AS T" queryout '+@OutputPath + @DatabaseName + '\' + @OutputFilename +' -c -t, -r\n -U'+@Username+' -P'+@Password+'  -S'+@ServerName + ' > ' +@OutputPath + @DatabaseName + '\' + @OutputFilename +'.txt'

 SET @StartProcedureTime = getdate() --take start time 
 EXEC @result = [master]..xp_cmdshell @Query
 SET @EndProcedureTime = getdate() --take end time 
 SET @TimeTaken = DATEDIFF(millisecond, @StartProcedureTime, @EndProcedureTime) --take difference in milliseconds.

 PRINT '"'+@QueryToRun + '" took ' + str(@TimeTaken) + ' Milliseconds.'

 FETCH NEXT FROM db_cursor INTO @OutputFilename, @QueryToRun   
END
CLOSE db_cursor  
DEALLOCATE db_cursor

go

sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 0
GO
RECONFIGURE
GO
sp_configure 'Show Advanced Options', 0
GO
RECONFIGURE
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM