如何判断变量(-v)是否在命令行(SQLCMD)上定义

u1ehiz5o  于 2022-10-22  发布在  其他
关注(0)|答案(4)|浏览(116)

是否有一种方法可以判断是否使用SQLCMD在命令行上定义了变量?
这是我的命令行:

sqlcmd -vDB="EduC_E100" -i"Z:\SQL Common\Admin\ProdToTest_DB.sql"

内部ProdToTest_DB。sql我想设置某种条件IF来检查变量是否不存在,如果不存在则定义它。

IF NOT $(DB)
:setvar DB "C_Q200"
END

我希望允许脚本从命令行和SSMS内部运行。
提前谢谢。

am46iovg

am46iovg1#

我在许多命令行变量相关脚本中使用了以下例程的变体。这里,“DataPath”是必填值。

DECLARE @Test_SQLCMD  varchar(100)

--  Confirm that SQLCMD values have been set (assume that if 1 is, all are)
SET @Test_SQLCMD = '$(DataPath)'

IF reverse(@Test_SQLCMD) = ')htaPataD($'
    --  SQLCMD variables have not been set, crash and burn!
    RAISERROR('This script must be called with the required SQLCMD variables!', 20, 1) with log
nkoocmlb

nkoocmlb2#

您可以使用try-catch语句来完成您想要的任务。只需在try中访问一个变量,如果这会产生错误,请在catch中定义它们。

rur96b6h

rur96b6h3#

基于Philip的回答,我在脚本的开头创建了这个测试,以验证要创建的数据库的有效名称是否传入:

DECLARE @valid_names VARCHAR(100) = 'DBPUB,DBPROD,DBPROD,DBEDITS,DBTEST,DBDEV'

IF CHARINDEX(UPPER('$(dbName)'), @valid_names) = 0
BEGIN
    PRINT 'This script must be called with a valid database name.'
    PRINT 'Valid names are: ' + @valid_names
    PRINT 'Example: sqlcmd -E -S DBSERVER1 -i create_database.sql -v dbName=DBPROD'
    SET NOEXEC ON
END
GO

PRINT 'Continuing script to create $(dbName)'

P.S.我没有找到方法来确定命令行调用中变量是否未定义,因此,如果未设置“'dbName'脚本变量未定义”消息,则无法绕过该消息。

6yt4nkrj

6yt4nkrj4#

由于sqlcmd和T-SQL变量的访问方式不同,它们可以具有相同的名称,并使用其中一个来检查另一个是否存在。

DECLARE @DB VARCHAR(MAX);
SET @DB = '$(DB)'

IF CHARINDEX('$', @DB)=1
BEGIN
RAISERROR('DB var is missing!', 20, 1) WITH LOG
END
ELSE
PRINT(@DB)

RETURN;

相关问题