本位出处:http://www.cnblogs.com/wy123/p/6426261.html
正如ADO.NET连接至数据执行增删查改操作一样,PowerShell 也可以连接SQLServer数据库,执行性增删查改功能,除此之外,PowerShell还可以执行DDL和DCL操作,另外就是支持DDL+DML+DCL的事务性操作,也就说PowerShell执行T-SQL的时候,可以将DDL+DML+DCL作为一个事物处理
PowerShell执行DML操作
新增操作
执行完之后来数据库中确认
修改
删除
查询操作,首先在数据库中插入两条记录
在PowerShell中遍历读取表中的记录,读取数据的时候,不支持GO,加上GO提交符会报错? 不太熟悉PowerShell,熟悉的朋友可以指点一下,谢谢。
PowerShell执行DDL和DML操作
与ADO.NET不同的是PowerShell可以执行DDL和DCL操作,这里以创建一个表并且授权给Test用户为示例
cls
$serverInstance="localhost\sqlserver2014A" #SQL Server实例名
$strSql = "
USE TestDB
GO
CREATE TABLE TestDMLByPS
(
Id int,
Name varchar(100)
)
GO
GRANT SELECT ON TestDMLByPS TO Test
GO
"
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null #加载程序集Microsoft.SqlServer.ConnectionInfo
$ServerConnection =new-object Microsoft.SqlServer.Management.Common.ServerConnection $serverInstance
try
{
$ServerConnection.Connect()
$ServerConnection.ExecuteNonQuery($strSql)
}
Catch
{
throw
}
创建了TestDMLByPS表
同时执行的DCL语句也生效了
PowerShell事务性操作
将一个DML操作和一个DDL操作放在一个事物中执行,如果DDL创建的表不存在,则两个SQL可以成功执行
将一个DML操作和一个DDL操作放在一个事物中执行,如果DDL创建的已经存在,那么DDL执行失败,那么DML执行的删除操作也失败,这一次删除操作换一个存在的Id,提示异常,事物回滚
可以发现,DML执行的删除也一并回滚,并没有删除掉Id=2的记录
与ADO.NET不同的是,PowerShell执行的事物可以包括DML和DDL或者DCL等操作
最后附上操作脚本
cls
$serverInstance="localhost\sqlserver2014A" #SQL Server实例名
$strSql1 = "USE TestDB
GO
CREATE TABLE T1(ID INT,VAL VARCHAR(50))
GO"
$strSql2 = "USE TestDB
GO
INSERT INTO T2 VALUES (1,'TestPowerShell')
GO"
$strSql3 = "USE TestDB
GO
UPDATE T2 SET Name = 'Test Update by PowerShell' WHERE ID = 1
GO"
$strSql4 = "USE TestDB
SELECT * FROM T2
"
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null #加载程序集Microsoft.SqlServer.ConnectionInfo
$ServerConnection =new-object Microsoft.SqlServer.Management.Common.ServerConnection $serverInstance
try
{
$ServerConnection.Connect()
#打开事务
$ServerConnection.BeginTransaction()
#执行DDL语句
$ServerConnection.ExecuteNonQuery($strSql1)
#执行DML语句
$ServerConnection.ExecuteNonQuery($strSql2)
#执行DML语句
$ServerConnection.ExecuteNonQuery($strSql3)
#执行DML语句,遍历查询结果
$sqlReader = $ServerConnection.ExecuteReader($strSql4)
$Datatable = New-Object System.Data.DataTable
$DataTable.Load($SqlReader)
for ($i=0;$i -le $DataTable.Rows.Count;$i++)
{
Write-Host 'value is : ' + $i + ' ' + $DataTable.Rows[$i][0]
Write-Host 'value is : ' + $i + ' ' + $DataTable.Rows[$i][1]
}
#提交事务
$ServerConnection.CommitTransaction()
}
Catch
{
if ($ServerConnection.TransactionDepth -gt 0)
{
$ServerConnection.RollbackTransaction()
}
throw
}