SQL Server 迁移 2008 年到 2016 年 - 引发错误语法错误



我们将从SQL Server 2008迁移到2016。我正在识别错误,并在触发器中收到以下错误:

"51001"附近的语法不正确。

我浏览了Microsoft网站上的Raiserror文档,但没有帮助。以下是 SQL。任何帮助将不胜感激。

IF (SELECT count(*) FROM dbo.u_sample_concrete ref, deleted
WHERE  ref.lab_cd =  deleted.lab_id) > 0
BEGIN
RAISERROR 51001 ''Trigger td_tblLAB on table dbo.tblLAB:  Primary key values found in table dbo.u_sample_concrete (lab_cd).  Delete restricted; the transaction is being rolled back.''
ROLLBACK TRANSACTION
RETURN
END

加上@DaleK的正确语法,语法RAISERRROR问题早已过时。IIRC,它在 20 年前被弃用(随着 SQL Server 2000 版本(,并在 SQL Server 2012 中完全删除。

下面是一个 powershell 脚本,它使用 T-SQL 脚本 DOM(也随 Dacfx NuGet 包一起提供(来标识语法无效的现有 T-SQL 模块。不过,它不会捕获动态SQL中的问题。

$connectionString = "Data Source=.;Initial Catalog=YourDatabase;Integrated Security=SSPI"
try {
$query = @"
SELECT 
QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
, OBJECTPROPERTY(object_id, 'ExecIsQuotedIdentOn') AS ExecIsQuotedIdentOn
, definition 
FROM sys.sql_modules;
"@
Add-Type -Path "C:Program Files (x86)Microsoft SQL Server140DACbinMicrosoft.SqlServer.TransactSql.ScriptDom.dll"
$connection = New-Object Data.SqlClient.SqlConnection($connectionString)
$command = New-Object Data.SqlClient.SqlCommand($query, $connection)
$connection.Open()
$reader = $command.ExecuteReader()
while ($reader.Read()) {
# use TSqlParser appropriate for your SQL Server version
$parser = New-Object Microsoft.SqlServer.TransactSql.ScriptDom.TSql130Parser($reader["ExecIsQuotedIdentOn"])
$parseErrors = New-Object Collections.Generic.List[Microsoft.SqlServer.TransactSql.ScriptDom.ParseError]
$scriptReader = New-Object IO.StringReader($($reader["definition"]))
Write-Host "Parsing $($reader["ObjectName"]) ..."
[void]$parser.Parse($scriptReader, [ref]$parseErrors)
if($parseErrors.Count -ne 0) {
Write-Host "Parsing errors for object $($reader["ObjectName"]): $($parseErrors | ConvertTo-Json)" -ForegroundColor Yellow
}
}
$connecton.Close()
}    
catch {
throw
}

Microsoft文档确实显示了您的陈述的 4 个错误。

  1. 参数必须位于括号内raiserror()
  2. 使用msd_id(51001( 时,预计有 4 个参数 - 您提供 2 个参数。
  3. 参数应用逗号分隔,
  4. 当字符串应该用单引号引起来时,您正在对字符串进行双引号。
RAISERROR (51001, -1,- 1, 'Trigger td_tblLAB on table dbo.tblLAB:  Primary key values found in table dbo.u_sample_concrete (lab_cd).  Delete restricted; the transaction is being rolled back.')

注意:现在的最佳做法是使用throw而不是raiserror

最新更新