2011-04-11 84 views

回答

3

您可以使用SQL CLR將任何想要寫入的文件寫入文件。你可以自己編寫代碼,或者你可以使用SQL#庫(我是作者,它不是免費的 - 對於這個功能 - 但並不昂貴),並使用File_WriteFile函數寫出文本。它允許附加數據。該庫對於大多數功能是免費的,但不適用於文件系統功能。它可以在這裏找到:http://www.SQLsharp.com/

如果你想嘗試這種編碼自己,我發現這個例子是基本的概念,我認爲你所要求的:http://www.mssqltips.com/tip.asp?tip=1662

3

這工作,但它是一個有點神祕。調整到您的查詢。基本上你會創建命令行回顯行,通過xp_cmdshell執行並循環執行。

declare @cmd varchar(500), @minid int, @maxid int; 
declare @output table(
    id int identity(1,1) primary key, 
    echo varchar(500) not null 
    ) 
set @cmd = 'select top 10 ''ECHO ''+name+'' >> C:\test.txt'' from master.dbo.sysobjects' 


insert into @output(echo) 
exec(@cmd) 

select @minid=Min(ID),@maxid=Max(ID) from @output 

while @minid <= @maxid 
begin 
    select @cmd = echo from @output where id = @minid; 
    exec xp_cmdshell @cmd; 
    set @[email protected]+1; 
end 
1

啓用和使用xp_cmdshell會將您的實例暴露給額外的安全風險。使用CLR更安全,但也不建議用於此目的。這兩個選項只會讓糟糕的設計決策變得更糟。

你爲什麼試圖從T-SQL寫入文件?抵制將SQL Server轉變爲腳本平臺的衝動。使用像SSIS,PowerShell或C#這樣的應用程序語言與SQL Server進行交互,並根據需要將輸出寫入日誌文件。

+0

我正在使用循環函數更新SQL中的記錄以獲取最高數字ID並在將其設置爲我正在更新的記錄的ID之前向其中添加1。這是從兩個系統合併到一個系統的信息。當我這樣做時,我想知道ID之前是什麼,然後是什麼,所以如果發生任何事情,我可以退出它或撤消更新。這不是應該在SQL中完成的事情嗎? – rud3y 2017-04-20 13:24:13

0

我在這個問題上有問題,所以我想提議我做了什麼。 我聲明瞭選擇結果的光標,然後我將它們寫入文件。例如:

DECLARE @cmd NVARCHAR(400) 
DECLARE @var AS NVARCHAR(50) 
     ,@Count = (SELECT COUNT(*) FROM Students) 
DECLARE Select_Cursor CURSOR FOR 
SELECT name FROM Students OPEN Select_Cursor 
FETCH NEXT FROM Select_Cursor INTO @var 
WHILE (@Count>0) 
SET @cmd = 'echo ' + @var +' >> c:\output.txt' 
EXEC master..xp_cmdshell @cmd 
SET @Count = @Count - 1 
FETCH NEXT FROM Select_Cursor INTO @var 
END 
CLOSE SelectCursor 
DEALLOCATE SelectCursor