如何在不访问外部SQL的情况下使用批处理(.bat)文件执行SQL命令?

时间:2014-11-17 17:13:57

标签: sql-server batch-file

是否可以在不访问外部SQL脚本文件的情况下执行以批处理(.bat)文件编写的SQL命令。我怎样才能做到这一点?我不想调用外部sql,因为我想要一个月的输入,然后在某些查询中执行包含该月份的sql命令。

3 个答案:

答案 0 :(得分:2)

假设您的文件夹中有3个文件 档案 1 => .sql文件
档案 2 => mybatchfile1.bat(有sqlcmds或cmd来执行上面的.sql文件)
档案 3 =>另一个批处理文件(myexecute.bat)来调用上面的批处理文件(含有内容"启动mybatchfile1.bat")

您需要创建的是 myexecute.bat ,其中包含以下内容:

start mybatchfile1.bat

call mybatchfile1.bat

您可以使用开始或通话。

答案 1 :(得分:0)

建议使用powershell脚本:

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "SERVER\Instance" -Password "Password"

输出将被组织为一个表格,它比bat文件

更容易

答案 2 :(得分:0)

是的,您可以从单个DOS批处理脚本运行查询,从命令行参数和/或用户提示获取输入,非常容易。 SQLCMD允许在命令行上传递查询。根据从命令行向程序传递内容的本质,您可以将DOS变量放在任何您想要的位置。

将以下内容放入扩展名为.cmd的脚本中(除非您特别需要在16位进程中运行某些内容,否则不应使用.bat扩展名):< / p>

@ECHO OFF

ECHO.
SET /P Month="Please enter in a month: "
ECHO.

ECHO.
ECHO Month = %Month%
ECHO.

SET Month=%Month:'=%
ECHO Month with single-quotes removed = %Month%
ECHO.

SQLCMD.EXE -E -Q "IF (COALESCE(TRY_CONVERT(TINYINT, REPLACE('%Month%', '''', '''''')), 0) NOT BETWEEN 1 AND 12) BEGIN RAISERROR('Please enter a value 1 - 12.', 16, 1); RETURN; END; SELECT DATENAME(MONTH, '2014-%Month%-01') AS [MonthName];" 

在不传递任何参数的情况下运行它。它将提示本月。然后它将在查询中替换该值,该查询在输入上执行自己的数据验证。

注意:请务必验证输入以防止SQL注入。由于这个原因,上面的示例用转义单引号替换单引号。它甚至在查询中使用变量之前删除所有单引号,因此REPLACE()只是一个冗余安全。

C:\>.\SingleScriptToAcceptParamForQuery.cmd

Please enter in a month: '5

Month = '5

Month with single-quotes removed = 5

MonthName
------------------------------
May

(1 rows affected)