【问题标题】:SQL Server sqlcmd execute os command in scriptSQL Server sqlcmd 在脚本中执行 os 命令
【发布时间】:2023-03-20 17:45:01
【问题描述】:

在 SQL Server 2016 中,我通过 SQLCMD 执行 SQL 脚本,如下所示:

SQLCMD -H XXXXXX,1433 -U username -P password -d mydatabase 
       -v varMDF="testing" -i "Script.sql" -o "DATA.txt"

在Script.sql 中,我想将一些文本回显到控制台,只是为了查看进度。我在脚本中有一个while循环并执行命令

echo I am in sql script

如图所示:

OPEN tab_cursor  

FETCH NEXT FROM tab_cursor INTO @tablename 

WHILE @@FETCH_STATUS = 0  
BEGIN
    !!echo i am in sql script   
    PRINT @tablename    

    FETCH NEXT FROM tab_cursor INTO @tablename
END 

CLOSE tab_cursor  
DEALLOCATE tab_cursor

问题是,它在控制台中仅显示一次“我在 sql 脚本中”这一行,但我可以在输出文件中看到许多表名条目。请帮助解决此问题或建议是否有其他方法可以做到这一点。

谢谢

【问题讨论】:

  • 你可以试试PRINT,但我不确定sqlcmd 是否会及时处理这些或缓存它们直到一切都完成。如果它缓存,try RAISERROR, as detailed here。 !! 没用,因为这个命令是由sqlcmd 解析和执行的,它完全忽略了它周围的T-SQL 逻辑。 SQL Server 不会“看到”这样的命令并且sqlcmd 不知道 SQL Server 在做什么,所以当循环被发送到服务器时,该命令只执行一次。
  • thansk @Jeroen,我尝试了 print 和 raiseerror 但都将消息放在输出文件中,而不是在控制台上。
  • 恐怕这是不可避免的。您不能让sqlcmd 输出事物,因为 SQL Server 正在处理它们,并且所有 SQL Server 输出都将写入文件(因为您已要求将其写入文件)。如果您不使用-o,则可以将标准输出通过管道传输到tee 之类的工具中,以便在文件和控制台中同时获取它,但我认为没有任何方法可以让sqlcmd 仅发送某些输出到标准输出。

标签: sql-server sqlcmd


【解决方案1】:

我会按顺序尝试以下解决方案:

1) 调查 BCP;它可能让您更有效地查看您正在做什么,并且根据输出文件的大小,它可能会明显更快。 (1b : 研究 SSIS,尽管它是一个巨大的痛苦)

2) 在 Script.sql 中执行 SQLCMD 执行,将数据推送到文件中,并让 PRINT 语句正常工作而无需 -o。 (注意:如果这是一个复杂的存储过程,你为什么不写一个复杂的存储过程?)

3) 使用服务器监控和分析器进行监控。如果这就是您需要输出的原因,这仅用于调试目的。

一般来说,在我看来,问题的根源在于您使用了错误的工具来完成这项工作。如果您想从 SQLCMD 获得大量关于进程状态的输出,您可能会在应该使用 BCP 的地方使用它,该 BCP 旨在以编程方式进行导出。根据我的经验,SQLCMD 并不是一个运行复杂脚本的好接口。它需要一劳永逸。

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多