变量名称在查询批处理或存储过程中必须是唯一的吗?

     2023-03-27     180

关键词:

【中文标题】变量名称在查询批处理或存储过程中必须是唯一的吗?【英文标题】:Variable names must be unique within a query batch or stored procedure? 【发布时间】:2021-12-15 17:35:05 【问题描述】:

我们如何在一个事务中运行多个 sql 脚本,其中每个脚本可能定义了相同的变量?

文件 1:

declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '1apples'+convert(varchar(28), getdate(),121)
select @query = 'select name into ' + quotename(@tableName) + ' from sys.objects'
print @query
exec (@query)
go

文件2:

declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '2apples'+convert(varchar(28), getdate(),121)
select @query = 'select name into ' + quotename(@tableName) + ' from sys.objects'
print @query
exec (@query)
 go

我在 PowerShell 中执行这样的文件:

try 

  $files = Get-ChildItem -Path $SqlFilesDirectory -File -Filter *.sql
  $filesSorted = $files |Sort-Object -Property Name
  $filesconcatenated = @(
      $files |Get-Content -Raw
  ) -join [Environment]::NewLine
  $filesconcatenated = 'SET XACT_ABORT ON ' + $filesconcatenated + ' SET XACT_ABORT OFF ' + [Environment]::NewLine
    $cmd = New-Object System.Data.SqlClient.SqlCommand ($filesconcatenated), $conn
    $cmd.Transaction = $tran
    [void]$cmd.ExecuteNonQuery()
   
  $tran.Commit()

catch 
  $tran.Rollback()
  Write-Host "Record not Inserted ->"
  $_.exception.message

finally 
  $conn.Close()

我收到以下异常:

使用“0”参数调用“ExecuteNonQuery”的异常:“不正确 关键字'declare'附近的语法。变量名“@tableName”有 已经宣布了。变量名称在查询中必须是唯一的 批处理或存储过程。变量名“@tableName”已经 被宣布。变量名称在查询批次中必须是唯一的,或者 存储过程。关键字 'SET' 附近的语法不正确。”

我们如何在一个事务中运行多个 SQL 脚本,其中每个脚本可能定义了相同的变量?

这是它尝试运行的完整脚本:

SET XACT_ABORT ON 
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '1apples'+convert(varchar(28), getdate(),121)
select @query = 'select name into ' + quotename(@tableName) + ' from sys.objects'
print @query
exec (@query)
go
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '2apples'+convert(varchar(28), getdate(),121)
select @query = 'select name into ' + quotename(@tableName) + ' from sys.objects'
print @query
exec (@query)
go
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '3apples'+convert(varchar(28), getdate(),121)
select @query = 'select name into ' + quotename(@tableName) + ' from sys.objects'
print @query
exec (@query)
go
 SET XACT_ABORT OFF 

【问题讨论】:

您正在构建您之前两个问题的答案,***.com/a/69756763/45375 和 ***.com/a/69763633/45375。这些答案为那些as ask的问题提供了解决方案 - 他们也没有解决您遇到的后来问题并不是他们的缺点,并且指导您应该接受的未来读者答案取决于他们是否按要求解决了问题。 【参考方案1】:

你不能在一个批次中两次使用相同的变量

因此,通过循环数组将它们作为单独的命令执行

$connString = "Server=tcp:$ServerName.database.windows.net,1433;Database=$DBName;User Id=$SvcAdminAccount@$ServerName;Password=$SvcAdminPassword;MultipleActiveResultSets=true;Persist Security Info=true;";
$conn = New-Object System.Data.SqlClient.SqlConnection $connString try

  $conn.Open()
  $files = Get-ChildItem -Path $SqlFilesDirectory -File -Filter *.sql
  $filesSorted = $files |Sort-Object -Property Name
  $tran = $conn.BeginTransaction()
  foreach ($file in $filesSorted)
  
    $query = "SET XACT_ABORT ON; " + (Get-Content -Raw $file)
    $cmd = New-Object System.Data.SqlClient.SqlCommand ($query, $conn, $tran)
    [void]$cmd.ExecuteNonQuery()
  
  $tran.Commit();

catch 
  Write-Host "Record not Inserted ->"
  $_.exception.message

finally 
  $tran.Dispose()
  $conn.Dispose()

注意Dispose 的使用方式,而不是Rollback,因为Dispose 永远不会抛出异常。它也在finally 而不是catch

【讨论】:

如何使用 SQL Server 将存储过程的结果存储在变量中

】如何使用SQLServer将存储过程的结果存储在变量中【英文标题】:HowtostoreresultofstoredprocedureinavariableusingSQLServer【发布时间】:2015-07-1507:08:50【问题描述】:我正在处理SQL查询,我必须将存储过程的结果存储到字符串类型变量中... 查看详情

在gridview行中保存选中的复选框c#asp

...误Thevariablename\'@Approved_By\'hasbeendeclared。变量名称在查询批处理或存储过程中必须是唯一的。我循环错了吗?inti=0;fo 查看详情

ID 在整个页面中必须是唯一的吗?

】ID在整个页面中必须是唯一的吗?【英文标题】:DoesIDhavetobeuniqueinthewholepage?【发布时间】:2012-03-1607:31:37【问题描述】:我正在使用jQuery,我只是想知道,ID在整个页面中是否必须始终是唯一的?课程,我知道,可以重复多次... 查看详情

表变量

...确定义的作用域,也就是声明该变量的函数、存储过程或批处理。表变量可应用于Select、Insert、Update和Delete语句中用到表的表达式的任何地方Declare@ 查看详情

在Redshift返回错误的存储过程中传递变量

】在Redshift返回错误的存储过程中传递变量【英文标题】:PassingvariableinsidestoredprocedureinRedshiftreturningerror【发布时间】:2021-11-0220:28:38【问题描述】:我有这个可以成功编译的存储过程,但是在调用该过程时,我得到一个错误:... 查看详情

MySQL设计;带有变量的视图或存储过程

】MySQL设计;带有变量的视图或存储过程【英文标题】:MySQLdesign;VieworStoredProcedurewithvariable【发布时间】:2012-11-0507:53:56【问题描述】:我要执行一个复杂的查询,从7-8个表中选择几列。我们不想用编程语言(PHP-Symfony1.4/Propel1.4... 查看详情

变量是啥意思

我是菜鸟不知道变量是什么意思知道的说下说得越简单越好不要太难我看不懂英语也不要变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;... 查看详情

mysql之游标

...打开游标:OPEN游标名称;读取游标数据:FETCH游标名INTO变量列表;关闭游标:CLOSE游标名;条件处理语句:DECLARE处理方式[CONTINUE或EXIT]HANDLERFOR问题操作;流程控制语句:跳转语句(ITERATE语句和LEAVE语句)、循环语句(LOOP、WHILE、REP... 查看详情

请问一下:c#数据库应用中,在存储过程中,不停报错:所创建的存储必须是批处理中仅有的语句。

...应用中,在存储过程中,不停报错:所创建的存储必须是批处理中仅有的语句。这是怎么回事???谢谢了。急用!!!就是说这个存储过程创建语句必须是独立的过程,怎么独立呢,在create语句前这一个go关闭任何前面的段落... 查看详情

线程本地存储,thread_local关键字是必须的吗?

...hread)是必须的吗?在MSDN上的UsingThreadLocalStorage中,为什么变量dwTlsIndex没有用thre 查看详情

pl/sql里executeimmediate的用法谁给解释下

...、用户定义存储过程或扩展存储过程。同时支持Transact-SQL批处理内的字符串的执行若要唤醒调用函数,请使用EXECUTEstored_procedure中描述的语法。语法执行存储过程:[[EXEC[UTE]][@return_status=]procedure_name[;number]|@procedure_name_var[[@parameter=... 查看详情

存储过程中'@'和'declare'有什么区别?(代码片段)

...RO@IDINT@NAMENVARCHARASBEGINDECLARE@ADDRESSNVARCHAREND答案SQLServer中的变量名称以@开头。存储过程(和用户定义的函数)可以以变量的形式接收parameters-它们只是用它们的名称和数据类型列出。此外,在存储过程和函数中,您可以创建局部变... 查看详情

使用 for 循环将多条记录插入 SQL Server 数据库

...进入第一行后出现异常@UserID已被声明。变量名称在查询批处理或存储过程中必须是唯一的。 查看详情

如何在批处理模式下运行存储过程或在并行处理中运行它

】如何在批处理模式下运行存储过程或在并行处理中运行它【英文标题】:howtorunthestoredprocedureinbatchmodeorinrunitinparallelprocessing【发布时间】:2018-02-2003:12:56【问题描述】:我们正在从全局临时表中迭代100k+条记录。下面的存储过... 查看详情

plsql中如何执行存储过程?

...库存储过程的简单布局。存在存储过程的定义,包括输入变量,输出变量等。输入变量由in定义,输出由out定义;可变部分:可以根据程序要求定义;数据处理逻辑部分:诸如添加,删除和修改差异表之类的操作;异常处理部分... 查看详情

变量必须在存储过程中声明错误

】变量必须在存储过程中声明错误【英文标题】:Variablemustbedeclarederrorinastoredprocedure【发布时间】:2013-11-0417:36:52【问题描述】:我有一个包,它的主体由一个存储过程组成。存储过程调用另一个包中的存储过程。但是,我需要... 查看详情

django csrf 令牌在每个请求上都必须是唯一的吗?

】djangocsrf令牌在每个请求上都必须是唯一的吗?【英文标题】:Doesdjangocsrftokenmustbeuniqueoneveryrequest?【发布时间】:2014-10-1921:05:29【问题描述】:我有一个关于DjangoCsrfViewMiddleware机制的问题。我知道,那个Django:为每个请求设置... 查看详情

如何使用 SET STATISTICS TIME 识别存储过程或批处理中最慢的查询?

】如何使用SETSTATISTICSTIME识别存储过程或批处理中最慢的查询?【英文标题】:HowtoidentifytheslowestqueriesinstoredprocedureorbatchusingSETSTATISTICSTIME?【发布时间】:2014-10-0909:34:51【问题描述】:我有一个很长的SQL脚本,包括1500行代码,有... 查看详情