我知道大多数人会给出响应,例如,右键单击数据库名称,选择任务,生成脚本等。大多数人在互联网上提供详细响应包括stackoverflow
很久以前我就已经知道了。
我的问题是编写脚本以导出/导入存储过程的任何建议。如果我只需做5或10,那就没什么大不了的了。我只需挑选正确的。如果有很多像50或更多,很痛苦,一定是错误。有时,为了让生活更轻松,我们希望使用 SELECT *
FROM (
SELECT T1.*,
ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY C, D) AS RN
FROM T1
) X
WHERE RN = 1
等后缀导出/导入。
有任何建议使用SQL脚本,C#或dos命令吗?
谢谢
答案 0 :(得分:0)
为什么在SQL或DOS脚本中请求答案时,是否用C#标记了这个问题?
此CMD脚本将删除名称以“usp”开头的所有存储过程:
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S %SERVER% -d %DATABASE% -Q "select name from sys.objects where type = 'P'" `) DO (echo %%F | findstr "^usp" >nul 2>&1 && sqlcmd -S %SERVER% -d %DATABASE% -Q "drop procedure %%F" )
全部在一行,%SERVER%和%DATABASE%标识服务器和数据库。
此脚本从名称与“usp * .sql”匹配的当前目录加载所有存储过程。如果调用XML数据类型方法,则需要将QUOTED_IDENTIFIER设置为ON。
for %%f in (usp*.sql) do sqlcmd -S %SERVER% -d %DATABASE% -I -i %%f
答案 1 :(得分:0)
因为你也标记了C#。使用.NET,您可以使用Microsoft.SqlServer.Smo来完成。有一个StoredProcedure class。这种方法可以让您真正控制您想要实现的任务。您可以使用PowerShell找到here的示例用法。
这是我可以帮助您的一个片段(使用Microsoft.SqlServer.Smo
,Microsoft.SqlServer.ConnectionInfo
,Microsoft.SqlServer.Management.Sdk.Sfc
DLL):
var serverConnection = new ServerConnection(new SqlConnection(ConnectionString));
var server = new Server(serverConnection);
foreach (StoredProcedure sp in server.Databases["YourDB"].StoredProcedures)
{
if (sp.Name.Contains("yourSubstring"))
{
System.IO.File.WriteAllText(sp.TextHeader + Environment.NewLine + sp.TextBody);
}
}