【发布时间】: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是否会及时处理这些或缓存它们直到一切都完成。如果它缓存,tryRAISERROR, 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