一尘不染

如何通过批处理将SQL存储过程保存到.sql文件

sql

我想将MS SQL Server 2005存储过程自动保存到.sql文件中(希望使用可以通过.bat调用的工具),所以我不必手动单击每个存储过程并保存它。

我已经从devioIT找到了SMOscript,但是它收集了所有表和存储过程,这需要一些时间。有什么类似的工具可以定义要导出的存储过程吗?我也缺少USE子句,与CREATE的手动导出为脚本sproc相比,SMOScript不会将其添加到导出的文件中。

最好的问候肖恩


阅读 129

收藏
2021-05-16

共1个答案

一尘不染

使用脚本创建批处理文件(对格式感到抱歉,但是执行批处理实际上应该是内联的):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql"

将其命名为“ run.bat”。现在,要执行批处理,请使用以下参数: run.bat [username] [password] [servername] [database]
例如:
run.bat sa pwd111 localhost \ SQLEXPRESS master 首先所有存储过程的名称都将存储在文件sp_list.txt中,然后在单独的脚本文件中一一对应。唯一的问题-每个脚本的最后一行都有结果计数-我正在努力:)

编辑 :查询中的错误已修复

删除“受影响的行”行
好吧,现在我们需要再创建一个批处理:

type %1 | findstr /V /i %2  > xxxtmpfile 
copy xxxtmpfile %1 /y /v
del xxxtmpfile

将其命名为“ line_del.bat”。请参阅,第一个参数是要处理的文件,第二个参数是要删除的搜索行的字符串。现在修改主批处理(再次,很抱歉格式化):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt"
call line_del sp_list.txt "rows affected"
call line_del sp_list.txt "row affected"
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected"
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected"
2021-05-16