【问题标题】:Write out to text file using T-SQL使用 T-SQL 写入文本文件
【发布时间】:2011-02-09 16:23:42
【问题描述】:

我正在使用 TSQL 创建一个基本的数据传输任务,我从一个数据库中检索比给定日期时间值更新的某些记录,并将它们加载到另一个数据库中。这将在一天中定期发生。

这是一个小任务,SSIS 似乎有点过头了 - 我只想使用一个运行 .sql 文件的计划任务。

我需要指导的是,我需要保留上次运行此任务的日期时间,然后在下次运行任务时使用它来过滤记录。我最初的想法是将日期时间存储在文本文件中,并在每次运行时将其作为任务的一部分进行更新(覆盖)。

我可以使用 T-SQL 毫无问题地读入文件,但写回让我卡住了。我见过很多使用动态构建的 bcp 命令的示例,然后使用 xp_cmdshell 执行该命令。麻烦的是,我要部署的服务器的安全性排除了 xp_cmdshell 的使用。

所以,我的问题是,是否有其他方法可以使用 TSQL 将日期时间值简单地写入文件,或者我应该考虑另一种方法?

编辑:很高兴得到关于 SSIS “矫枉过正”的纠正......

【问题讨论】:

    标签: tsql sql-server-2008 text


    【解决方案1】:

    您可以构建一个小型应用程序或 cmd 文件,从调度程序包装您的 SQL 脚本的开头。在该应用程序中,您可以将日期和时间存储在一个文件中,以便下次加载时从 SQL 脚本中读取。

    我相信这可以做得更好,但只是为了向您展示这个想法,这里是您可以使用的命令文件的内容。从 YourScript.sql 中读取 datetime.txt 的内容

    sqlcmd YourScript.sql
    sqlcmd -Q"select getdate()" -o datetime.txt
    

    【讨论】:

    • 太棒了,这正是我需要的。谢谢!
    【解决方案2】:

    为什么使用文本文件。如果您使用 TSQL 并从表中读取数据,请保持一致并写入同一个数据库。例如。创建一个表来存储上次查询时间。

    【讨论】:

    • 我可以看到这将是理想的,但要做到这一点,我需要创建一个新的数据库来存储表 - 两个数据库都支持专有应用程序,所以我不能创建一个表中的任何一个。
    • 在不同的架构中呢?我建议更改交付的对象通常是一个坏主意,但添加新对象几乎没有影响。如果它在另一个模式中,则不会在交付的对象中“丢失”它。
    【解决方案3】:

    您确定需要文件吗?如果您可以使用表格来存储日期并且您可以访问两个数据库:

    设置 xact_abort 开始交易 插入 database2.dbo.myTable (...) 选择 ... 从 database1.dbo.myTable 其中 database1.dbo.myTable.someDate >(从 database1.dbo.myTransferDate 中选择 lastRunTime) 更新 database1.dbo.myTransferDate 设置 lastRunTime = getdate() 提交事务

    【讨论】:

    • 查看我对 Karl 类似回答的回复。我开始认为可能值得为此任务创建一个专用数据库,这样我就可以按照您和 Karl 的建议去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多