Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在包含动态sql的事务中嵌入对具有的存储过程的调用_Sql_Vb.net_Sql Server 2008_Tsql - Fatal编程技术网

在包含动态sql的事务中嵌入对具有的存储过程的调用

在包含动态sql的事务中嵌入对具有的存储过程的调用,sql,vb.net,sql-server-2008,tsql,Sql,Vb.net,Sql Server 2008,Tsql,我想在insert select语句末尾调用一个存储过程 但是在事务提交或回滚之前,我希望存储过程成为包含insert-select的事务的一部分。如果我希望新代码成为包含事务的一部分,那么编写动态SQL是唯一的选项吗 字符串附件的数量实际上相当大,有数千个,但我只分享了一小段代码,以突出说明这个概念并展示我想要做的事情 sqlStr.Append("BEGIN TRANSACTION; ") sqlStr.Append("INSERT INTO table_chg (Column1, Col

我想在insert select语句末尾调用一个存储过程 但是在事务提交或回滚之前,我希望存储过程成为包含insert-select的事务的一部分。如果我希望新代码成为包含事务的一部分,那么编写动态SQL是唯一的选项吗

字符串附件的数量实际上相当大,有数千个,但我只分享了一小段代码,以突出说明这个概念并展示我想要做的事情

sqlStr.Append("BEGIN TRANSACTION; ")

sqlStr.Append("INSERT INTO table_chg (Column1, Column2) ")                                             
sqlStr.Append("SELECT r.Column8 , r.Column9 ")
sqlStr.Append("FROM v_table r, table1 r ")
sqlStr.Append("WHERE r.columnName1 = '{1}' ")
sqlStr.Append("  AND r.columnName2 = '{2}'; ")
sqlStr.Append(" ") 

/** ADD STORED PROCEDURE HERE    */

EXEC sp_storedProc '{1}'   **THIS DOES NOT WORK. BUT {1} does resolve to the correct variable that I need. Also the stored procedure works standalone and the VB.Net code does try to reference the stored procedure because if I give the stored procedure an incorrect name, I get an error back which says "stored procedure not found**

sqlStr.Append("IF @@ERROR <> 0 ")
sqlStr.Append("    ROLLBACK TRANSACTION ")
sqlStr.Append("ELSE ")
sqlStr.Append("    COMMIT TRANSACTION; ")

strError = DatabaseClass.ExecuteNonQueryReturnError (String.Format(sqlStr.ToString(), parameter1, parameter2))

以下是您需要做的:

1-创建事务对象并使用Try块

2-使用事务对象,执行SqlCommand.ExecuteOnQuery插入-它将返回受影响的记录数

3-使用事务对象,执行SqlCommand.ExecuteOnQuery Strored过程-它将返回受影响的记录数和[如果需要]输出参数

4-根据步骤2和步骤3的结果回滚或提交事务对象

5-不要这样做

sqlStr.Append("INSERT INTO table_chg (Column1, Column2) ")                                               
sqlStr.Append("SELECT r.Column8 , r.Column9 ").....
而是这样做:

Dim sql as String = _
    "INSERT INTO table_chg (Column1, Column2) " & _
    "SELECT r.Column8 , r.Column9 ".......
@@错误发生后,只要执行任何其他语句,ERROR函数就会重置为null,因此最好在您认为可能发生错误的地方使用变量

在联接条件中,两个表使用了相同的别名r,这将导致错误。别名应该不同

在join中使用ON子句

对于您的@ERROR函数,语句应该如下所示

@@错误

开始交易 声明@Error INT; 插入表_chg第1列、第2列 选择r.Column8、r.Column9
从v_表r1内部联接表1 r2-可以尝试使用TransactionScope

Using scope As TransactionScope = New TransactionScope
Try
'Here will be the DB call code
'Make some verifications if everyting was ok in DB
SCope.Complete()

Catch ex As Exception
End Try
End Using
我不会使用BEGIN TRY END TRY from SQL,因为如果发生错误,它不会一直捕获。例如,如果调用了一个抛出链接服务器的方法,并且链接服务器上发生了错误,则“开始-尝试-结束-尝试”不会捕获该错误:此外,“尝试…捕获”构造会捕获严重性高于10且未关闭数据库连接的所有执行错误


如果使用TRANSACTIONSCOPE,则可以从SQL中删除事务。如果由于脚本执行后出现错误或验证而未调用scope.Complete,则所有内容都将回滚

关于可行性有什么想法吗?我假设这是您为生成示例而进行的简化的副产品,但您对“v_table”和“table1”都使用别名“r”。那会导致一个错误。是的,那是正确的。这实际上是一个巨大的sql语句,我删掉了…很好的观察…你能解释一下你对5的推理吗?虽然原始海报上没有这样说,但看起来他或她正在使用StringBuilder。使用串联字符串有什么好处?处理循环时,字符串生成器是绝对必需的。但是当字符串事先已知时,最好声明一个字符串。字符串生成器占用资源。如果您不初始化它,它将在您添加数据时调整自身大小,这将占用更多资源。在当前情况下,使用字符串更合适。字符串是字节数组,字符串生成器是管理它的机制。我们不需要它,你说得对。我们不应该使用字符串生成器。但不幸的是,我被这段代码所困扰,而这段代码所做的只是使用Sql代码进行Stringbuilding。。。。。