4

我有一个 .sql 脚本,其中包含许多可用于某些临时表的操作查询。该脚本需要运行两次,中间有一些其他命令,即:

  1. 从源 A 加载暂存表
  2. 用来do_stuff.sql处理它
  3. 将结果移动到某处。
  4. 对源 B 重复步骤 1-3。

蛮力方法是根据需要复制和粘贴 dostuff.sql。虽然这在技术上可行,但有更好的方法吗?

我希望有一个RunThisSQL 'C:\do_stuff.sql'我还没有发现的命令。

更新

好吧,已经有大约 5 年了,我刚刚重新发现了这个老问题。我最近做了这个并且做了一个游标来循环通过一个主表。对于该主表中的每条记录,脚本使用主表设置的变量通过内部脚本运行。

https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

4

4 回答 4

2

如果您使用 Visual Studio,您可以创建“Sql Server 数据库”项目。使用该项目,您可以创建脚本,让您以某种方式执行 *.sql 文件

 /*
Post-Deployment Script Template                         
--------------------------------------------------------------------------------------
 This file contains SQL statements that will be appended to the build script.       
 Use SQLCMD syntax to include a file in the post-deployment script.         
 Example:      :r .\myfile.sql                              
 Use SQLCMD syntax to reference a variable in the post-deployment script.       
 Example:      :setvar TableName MyTable                            
               SELECT * FROM [$(TableName)]                 
--------------------------------------------------------------------------------------
*/

也可以看看。http://candordeveloper.com/2013/01/08/creating-a-sql-server-database-project-in-visual-studio-2012/

于 2013-05-21T18:34:21.187 回答
2

尝试使用 xp_cmdshell。

 EXEC xp_cmdshell  'sqlcmd -S ' + @ServerName + ' -d ' + @DBName + ' -i ' +@FileName
于 2013-05-22T06:41:30.387 回答
1

xp_cmdshell 和串联不能很好地配合使用,通常会导致“'+' 附近的语法不正确”错误。因此,对于上面的Jeotics解决方案,您将需要为传递给 xp_cmdshell 的整个字符串创建一个变量(包括任何可能包含空格的引号(例如文件路径\文件名)。这在 Microsoft 文档中提到了 xp_cmdshell此处。其他您将不得不应对的问题是 SQL Server 的默认设置,其中已禁用 xp_cmdshell,如此处所述,并授予非系统管理员使用 xp_cmdshell 的权限. 该文档通常建议不要将 xp_cmdshell 权限授予太多人,因为它是那些有恶意的人的工具,但是如果像我一样,您拥有最少且值得信赖的数据库用户,那么它似乎是一个合理的解决方案。最后一个需要正确配置的问题是此处概述的 SQL Server 代理。文档概述了 SQL Agent 负责后台调度(如备份)和命令行语句的执行等。

DECLARE
    @Server nvarchar (50)
    ,@Database nvarchar(50)
    ,@File nvarchar(100)
    ,@cmd nvarchar(300);

SET @Server = server_name;
SET @Database = database_name;
SET @File = 'C:\your file path with spaces';
SET @cmd = 'sqlcmd -S ' + @Server + ' -d ' + @Database + ' i "' + @File + '"';

EXEC xp_cmdshell @cmd;
于 2018-08-31T03:51:54.153 回答
1

在 SQL Server 中启用 xp_cmdshell 存在一些安全问题。您可以创建一个 CLR 存储过程,该过程执行传递的文件内容。此 CLR 存储过程专门用于此目的,不像 xp_cmdshell 可以通过命令提示符执行任何操作。

启用 xp_cmdshell 的问题

创建 CLR 存储过程

于 2018-08-31T04:31:23.507 回答