0

首先我想让你知道我不是工程师,我只是一个网页设计师,在我的工作范围内工作。我们有一堆在 Windows server 2003 / SQL 2000 环境中运行的 ASP 经典应用程序。该公司购买了一台带有 Windows server 2008R2 和 SQL 2012 的新服务器,他们给了我将应用程序迁移到新服务器的任务。几周以来,我阅读并阅读了很多关于此的手册和文档,除了其中一个应用程序之外,我完成了我的任务。该应用程序生成并创建和接口以回答调查。这很奇怪,因为登录页面有效:输入用户名并通过,然后进入管理区域,存储在数据库中的选项显示没有问题,但是当我尝试进入调查回答时,浏览器给了我这个:

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序错误“80040e14”

[Microsoft][ODBC SQL Server Driver][SQL Server]'@errno' 附近的语法不正确。

/SEL/Encuesta/preguntatodo_nuevo.asp,线 108

这是我在 /SEL/Encuesta/preguntatodo_nuevo.asp, línea 108 中找到的内容:

sSQL = "Update UsuariosClima set NumCuestContestados = NumCuestContestados+1 Where IDUsuario = " & IDUsuario
conn.Execute(sSQL)

我知道仅凭这些信息很难帮助我,所以如果您需要更多数据,请告诉我。我不想让你做我的工作,如果有人能引导我走向正确的方向,我会自己继续。非常非常感谢你。

请记住:我不是工程师,像小时候一样给我解释。

更新 - UsuariosClima 中的触发器:

tD_Usuarios:

ALTER trigger tD_Usuarios on dbo.UsuariosClima for DELETE as

begin
declare  @errno   int,
       @errmsg  varchar(255)

if exists (
  select * from deleted,AccesoCuestionarioClima
  where

    AccesoCuestionarioClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30001,
         @errmsg = 'Cannot DELETE "Usuarios" because "AccesoCuestionario" exists.'
  goto error
end

if exists (
  select * from deleted,AccesoClienteClima
  where

    AccesoClienteClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30001,
         @errmsg = 'Cannot DELETE "Usuarios" because "AccesoCliente" exists.'
  goto error
end

if exists (
  select * from deleted,PertenenciaClima
  where

    PertenenciaClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30001,
         @errmsg = 'Cannot DELETE "Usuarios" because "Pertenencia" exists.'
  goto error
end

update RespuestaCuestionariosClima
  set

    RespuestaCuestionariosClima.IDUsuario = NULL
  from RespuestaCuestionariosClima,deleted
  where

    RespuestaCuestionariosClima.IDUsuario = deleted.IDUsuario

return
error:
raiserror @errno @errmsg
rollback transaction
end

tU_Usuarios:

ALTER trigger tU_Usuarios on dbo.UsuariosClima for UPDATE as
begin
  declare  @numrows int,
       @nullcnt int,
       @validcnt int,
       @insIDUsuario int,
       @errno   int,
       @errmsg  varchar(255)
  select @numrows = @@rowcount

  if

    update(IDUsuario)
  begin
    if exists (
      select * from deleted,AccesoCuestionarioClima
      where

    AccesoCuestionarioClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30005,
         @errmsg = 'Cannot UPDATE "UsuariosClima" because "AccesoCuestionarioClima" exists.'
  goto error
end
  end

  if

update(IDUsuario)
  begin
if exists (
  select * from deleted,AccesoClienteClima
  where

    AccesoClienteClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30005,
         @errmsg = 'Cannot UPDATE "UsuariosClima" because "AccesoClienteClima" exists.'
  goto error
end
  end

  if

update(IDUsuario)
  begin
if exists (
  select * from deleted,PertenenciaClima
  where

    PertenenciaClima.IDUsuario = deleted.IDUsuario
)
begin
  select @errno  = 30005,
         @errmsg = 'Cannot UPDATE "UsuariosClima" because "PertenenciaClima" exists.'
  goto error
end
  end

  if

update(IDUsuario)
  begin
update RespuestaCuestionariosClima
  set

    RespuestaCuestionariosClima.IDUsuario = NULL
  from RespuestaCuestionariosClima,deleted
  where

    RespuestaCuestionariosClima.IDUsuario = deleted.IDUsuario
end

return
error:
raiserror @errno @errmsg
rollback transaction
end
4

2 回答 2

0

我把答案放在这里是为了让它更明显。谢谢。

由于他们正在迁移到 SQL Server 2012,因此两个触发器(更新和删除)都应该从 RAISERROR 更改为 THROW 要做到这一点,他应该将行(在两者中)更改为 THROW @errno, @errmsg,2; - 鬼

于 2012-07-13T23:54:31.983 回答
0

乍一看,我相信您描述的第一个错误可能只不过是 tU_Usarios 触发器中调用 raiserror 的语法错误。我相信这在上面的“第 108 行”中反映为错误,因为更新是导致错误的原因,但是调用 RAISERROR 的代码将问题冒泡回原始语句。当更新发生时,触发器触发,在被捕获的触发器代码中发生错误,但是当控制传递给调用 RAISERROR 的代码时,在“@errno”处出现语法错误。

我相信 RAISERROR 的参数需要以逗号分隔的列表提供,包含在括号内等。我相信参数的最小数量是三个 - 一个消息 ID 或字符串,后跟一个严重性代码,然后是一个状态代码. 大多数情况下,最后两个值最终分别为 16 和 1。

于 2012-07-13T20:04:14.280 回答