如何更改我的T-SQL查询以覆盖csv文件而不是向其附加数据?

use*_*933 2 t-sql sql-server csv openrowset

我将以下T-SQL代码配置为使用SQL Server代理作业每天运行.我的数据库在SQL Server 2012上运行.

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;HDR=YES;FMT=Delimited','SELECT * FROM [myfile.csv]')

SELECT ReservationStayID,NameTitle,FirstName,LastName,ArrivalDate,DepartureDate FROM [GuestNameInfo]
Run Code Online (Sandbox Code Playgroud)

我的问题是此查询的输出将附加到csv文件中的现有记录.我希望每次运行SQL Server代理作业时输出都覆盖现有内容.

如何修改我的查询以实现此目的?

Jen*_*n R 5

我建议先将现有的myfile.csv重命名为其他内容(如myfile_ [DateOfLastRun] .csv).然后使用新的myfile.csv重新开始.这样一来,如果在这个过程之外出现问题,并且你需要myfile.csv中的任何一天/周/月,那么你就拥有它.

您可以在BAT文件中使用BCP:

set vardate=%DATE:~4,10%
set varDateWithoutSlashes=%vardate:/=-%
bcp "SELECT someColumns FROM aTable" queryout myFile_%varDateWithoutSlashes%.csv -t, -c -T
Run Code Online (Sandbox Code Playgroud)

上面的示例使用名称中已有的日期创建CSV.您也可以重命名现有文件,然后在没有日期的情况下创建新的myfile.csv:

set vardate=%DATE:~4,10%
set varDateWithoutSlashes=%vardate:/=-%
ren myFile.csv myFile_%varDateWithoutSlashes%.csv
bcp "SELECT someColumns FROM aTable" queryout myFile.csv -t, -c -T
Run Code Online (Sandbox Code Playgroud)

确保在某处清理旧文件 - 甚至可以在与此文件相同的批处理过程中完成.

您可以将数据库名称和服务器名称添加到bcp行 - 默认情况下,它连接到本地服务器和用户的默认数据库(有关更多选项,请参阅BCP文档链接)

bcp databaseName "SELECT someColumns FROM aTable" queryout myFile.csv -t, -c -T -S serverName
Run Code Online (Sandbox Code Playgroud)