用于更改表的Windows Powershell脚本

时间:2016-03-05 18:06:56

标签: sql-server windows powershell

我有以下脚本,名为alterTable.ps1。我试图通过在表中添加两个新列来改变表。

这是脚本

function die {
    "Error: $($args[0])"
    exit 1
}
function verifySuccess {
    if (!$?) {
        die "$($args[0])"
    }
}
# Create variables and assign environment variables
$INSTANCE_HOST = $env:HOST
$INSTANCE_PORT = $env:PORT
$INSTANCE_NAME = $env:INSTANCE
$DATABASE_NAME = $env:DATABASE_NAME
# Execute the alter table, passing the variables
#sqlcmd -U sa -P sapassword -S "$INSTANCE_HOST\$INSTANCE_NAME,$INSTANCE_PORT" -q ”use $DATABASE_NAME; ALTER TABLE dbo.tabletest ADD Test1 VARCHAR(6) NULL, Test2 VARCHAR(10) NULL”
VerifySuccess "sqlcmd failed to alter table tabletest"

当我使用传递给脚本的值执行脚本时,会收到错误

C:\> .\alterTable.ps1 "WINDOWSHOST" "1433" "MSSQLSERVER" "dbname"

获取如下错误:

  

HResult 0x57,Level 16,State 1 SQL Server网络接口:   连接字符串无效[87]。 Sqlcmd:错误:Microsoft SQL   Server Native Client 10.0:与网络相关或特定于实例的   建立与SQL Server的连接时发生错误。   找不到服务器或无法访问服务器。

如果我在脚本中对这些值进行硬编码,那么它运行正常。

还有一件事,我如何在执行后退出脚本并检查退出状态?

1 个答案:

答案 0 :(得分:0)

您永远不会访问传递给脚本的参数,而是从四个环境变量(您从未设置过?)中读取值。如果需要,您应该使用默认值设置为环境变量值的参数。例如:

param(
    $INSTANCEHOST = $env:HOST,
    $INSTANCEPORT = $env:PORT,
    $INSTANCENAME = $env:INSTANCE,
    $DATABASENAME = $env:DATABASE_NAME
)

function die {
    "Error: $($args[0])"
    exit 1
}
function verifySuccess {
    if (!$?) {
        die "$($args[0])"
    }
}

# Execute the alter table, passing the variables
sqlcmd -U sa -P sapassword -S "$INSTANCEHOST\$INSTANCENAME,$INSTANCEPORT" -q ”use $DATABASENAME; ALTER TABLE dbo.tabletest ADD Test1 VARCHAR(6) NULL, Test2 VARCHAR(10) NULL”
VerifySuccess "sqlcmd failed to alter table tabletest"

像这样使用:

C:\> .\alterTable.ps1 -INSTANCEHOST "WINDOWSHOST" -INSTANCEPORT "1433" -INSTANCENAME "MSSQLSERVER" -DATABASENAME "dbname"