Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server:如何从另一个查询执行.sql?_Sql_Sql Server 2008 - Fatal编程技术网

sql server:如何从另一个查询执行.sql?

sql server:如何从另一个查询执行.sql?,sql,sql-server-2008,Sql,Sql Server 2008,我有一个.sql脚本,其中包含许多操作查询,可以在一些临时表上运行。此脚本需要运行两次,其间还有一些其他命令,即: 从源A加载临时表 使用do_stuff.sql来处理它 将结果移动到某个地方 对源B重复步骤1-3 蛮力方法是根据需要复制并粘贴dostuff.sql。虽然这在技术上可行,但还有更好的方法吗 我希望有一个像RunThisSQL'C:\do\u stuff.sql'这样的命令我还没有发现 更新 好吧,已经5年了,我刚刚重新发现了这个老问题。我最近做了这件事,并制作了一个光标在主表中循

我有一个.sql脚本,其中包含许多操作查询,可以在一些临时表上运行。此脚本需要运行两次,其间还有一些其他命令,即:

  • 从源A加载临时表
  • 使用
    do_stuff.sql
    来处理它
  • 将结果移动到某个地方
  • 对源B重复步骤1-3
  • 蛮力方法是根据需要复制并粘贴dostuff.sql。虽然这在技术上可行,但还有更好的方法吗

    我希望有一个像
    RunThisSQL'C:\do\u stuff.sql'
    这样的命令我还没有发现

    更新 好吧,已经5年了,我刚刚重新发现了这个老问题。我最近做了这件事,并制作了一个光标在主表中循环。对于主表中的每条记录,脚本使用主表设置的变量通过内部脚本运行


    如果使用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)]                 
    --------------------------------------------------------------------------------------
    */
    
    另见

    尝试使用xp\u cmdshell

     EXEC xp_cmdshell  'sqlcmd -S ' + @ServerName + ' -d ' + @DBName + ' -i ' +@FileName
    

    xp_cmdshell和连接不能很好地结合在一起,通常会导致“靠近“+”的语法不正确”错误。因此,为了进一步解决上述问题,您需要为传递给xp_cmdshell的整个字符串创建一个变量(包括任何可能包含空格的内容的引号(例如filepath\filename))。Microsoft xp_cmdshell文档中提到了这一点。您必须解决的其他问题是SQL Server的默认设置,该SQL Server已按概述禁用xp_cmdshell,并向非系统管理员授予使用xp_cmdshell的权限。文档通常建议不要将xp_cmdshell权限授予由于它是恶意用户的载体,所以用户太多,但如果像我一样,您的数据库用户最少且值得信赖,那么这似乎是一个合理的解决方案。需要正确配置的最后一个问题是所述的SQL Server代理。文档概述了SQL代理负责后台调度(如备份)和命令行语句的性能等

    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;
    

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


    为什么不将该文件转换为存储过程?如何执行脚本?一种方法是编写一个批处理/PowerShell例程,用脚本运行
    sqlcmd
    ,类似
    sqlcmd-SMyServer-ido_stuff.sql
    @voithos,我正在MS sql Server Management Studio中手动运行它。另一种方法是words,打开.sql文件并点击Execute。在sql命令promte中尝试这个cmd@'C:/do_stuff.sql';这在Oracle中是有效的。问题是sql代码在实际运行时正在服务器上运行。它不再有任何(真实的)代码与向服务器发送查询的SSMS实例的关系,而不是连接。TDS中没有任何内置内容允许它以某种方式请求通过该连接加载和发送新文件。