我正在编写一个脚本以使用 sqlcmd 在终端中运行。我的脚本需要一些变量,但如果其中一个或多个变量不在 -v

问题描述 投票:0回答:1

我有这个脚本(my_script.sql):

SET NOCOUNT ON;
DECLARE @SchemaName NVARCHAR(128);
DECLARE @TableName NVARCHAR(128);

SET @SchemaName = '$(SchemaName)';
SET @TableName = '$(TableName)';

IF @SchemaName IS NULL or @SchemaName = ''
BEGIN
    SET @SchemaName = 'dbo';
END

PRINT 'The full table name is: ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName);

当我使用以下命令从命令行调用它时:

sqlcmd -S my_db_ip -U username -P myPassword -d my_db_name 
       -i my_script.sql -v SchemaName dbo TableName Users

我在终端中得到以下输出:

The full table name is: [dbo].[Users]

我想要,但是如果部署了脚本并且用户不知道

SchemaName
是什么,他们可以让它使用默认的“dbo”。

但是,当使用

调用时
sqlcmd -S my_db_ip -U username -P myPassword -d my_db_name 
       -i my_script.sql -v  TableName Users

(注意没有提供

SchemaName

我在终端上得到以下输出:

'SchemaName' scripting variable not defined.
The full table name is: [@SchemaName)].[Users]

如何修复此问题,以便如果变量未包含在

sqlcmd
参数中,我不会收到未定义的消息,并且完整的表名称为
[dbo].[Users]

我尝试更改默认值的位置,但仍然给出变量未定义消息,并且仍然给出相同的输出:

如果我更改变量检查:

IF @SchemaName IS NULL OR @SchemaName = '' OR @SchemaName = '$(SchemaName)'
BEGIN
    SET @SchemaName = 'dbo';  -- Default to 'dbo' if not provided
END

...

我得到:

'SchemaName' scripting variable not defined.  
The full table name is: [dbo)].[Users]

这是错误信息仍然包含在内。

我不知道如何解决这个问题。

powershell error-handling variable-assignment sqlcmd
1个回答
0
投票

我有一个几年前编写的模板引擎,用于将简单模板与包含实际值的 CSV 文件结合起来。 该工具可能适合您的情况。

这是我的模板引擎:

 <#
.NOTES
    Script: Expand-Csv    Rev:  3.2
    By:     DGC           Date: 2-21-19
.SYNOPSIS
    Generates multiple expansions of a template,
    driven by data in a CSV file.
.DESCRIPTION
    This function is a table driven template tool. 

    It generates output from a template and
    a driver table.  The template file contains plain
    text and embedded variables.  The driver table 
    (in a csv file) has one column for each variable, 
    and one row for each expansion to be generated.
#>
function Expand-csv {
    [CmdletBinding()]
    Param (
       [Parameter(Mandatory=$true)] [string] $driver,
       [Parameter(Mandatory=$true)] [string] $template
    )
    Process {
       Import-Csv $driver | % {
           $_.psobject.properties | % {Set-variable -name $_.name -value $_.value}
           Get-Content $template | % {$ExecutionContext.InvokeCommand.ExpandString($_)} 
       }
    }
}

这是我的模板引擎的演示,有两个示例。 其中一个示例生成一个重复的 SQL 脚本,其中解析了变量数据。

<#  
.SYNOPSIS
    Produces sample results for Expand-csv
.NOTES
    Script:  Demo               Rev: 1.3
    By:   DGC                   Date: 7-15-23
#>


# Example 1:  Set up input files
@'
NAME,ID
John,18
Dave,19
Carmen,20
Eric,21
Tom,22
Lisa,23
Kyle,24
'@ | Out-File jars.csv

@'
java -jar --create -user $name -id $id -file D:/HR/$name-$id-form.pdf
'@ | Out-file jars.tmplt


'    Example 1:  CSV File'
'    --------------------'
'    '
Type Jars.csv
'   '
'    CSV Data viewed as a table'
'    '
Import-Csv Jars.csv | Format-table -auto 
'    '
'    Example 1:  Template'
'    --------------------'
'    '

type Jars.tmplt
'    '
'    Example 1:  Results'
'    -------------------'
Expand-csv -Driver Jars.csv -Template Jars.tmplt

#    Example 2:  Set up input files

@'
privs,table,user
ALL,Employees,DBA
READ,Employees,Analyst
"READ, WRITE", Employees, Application
ALL,Departments,DBA
READ,Departments,"Analyst, Application"
'@  | Out-File Grants.csv

@'
grant $privs 
   on $table 
   to $user;

'@ | Out-File Grants.tmplt

'    '
'    '
'    '
'    Example 2:  CSV File'
'    --------------------'
'    '
Type Grants.csv
'    '
'    CSV DAta viewed as a table'
'    '
Import-Csv Grants.csv | Format-Table -auto 
'    '
'    Example 2:  Template'
'    --------------------'
'    '
type grants.tmplt
'    '

'    Example 2:  Results'
'    -------------------'
'    '
Expand-csv -Driver Grants.csv -Template Grants.tmplt
'   '

我还没有弄清楚如何将其应用到您的案例中。 也许你可以从这里拿走它。

© www.soinside.com 2019 - 2024. All rights reserved.