0

まず第一に、私はエンジニアではなく、仕事の制約の中で働いている単なるウェブデザイナーであることを知ってもらいたいです。Windows Server 2003 /SQL2000環境で実行されているASPクラシックで作成された多数のアプリケーションがあります。同社は、Windows Server2008R2とSQL2012を搭載した新しいサーバーを購入し、アプリケーションを新しいサーバーに移行するタスクを提供してくれました。私はこれに関する多くのマニュアルとドキュメントを数週間読んで読み、アプリの1つを除いてタスクを実行しました。このアプリは、調査に回答するためのインターフェースを作成、作成、インターフェースします。ログインページが機能するため、非常に奇妙です。ユーザー名とパスを入力して管理領域に入ると、データベースに保存されているオプションが問題なく表示されますが、アンケートに回答しようとすると、ブラウザから表示されます。これ:

Microsoft OLE DB ProviderforODBCドライバーエラー「80040e14」

[Microsoft] [ODBCSQLServerドライバー][SQLServer]「@errno」の近くの構文が正しくありません。

/SEL/Encuesta/preguntatodo_nuevo.asp、línea108

/SEL/Encuesta/preguntatodo_nuevo.asp、línea108で見つけたものは次のとおりです。

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

一見したところ、あなたが説明する最初のエラーは、tU_Usariosトリガーでのraiserrorの呼び出しの構文エラーにすぎないと思います。更新がエラーの原因であるため、これは上記の「行108」のエラーとして反映されていると思いますが、RAISERRORを呼び出すコードは、問題を元のステートメントに戻します。更新が発生すると、トリガーが起動し、キャッチされたトリガーコードでエラーが発生しますが、RAISERRORを呼び出すコードに制御が渡されると、「@errno」で構文エラーが発生します。

RAISERRORの引数は、カンマ区切りのリストで指定し、括弧で囲む必要があると思います。また、パラメーターの最小数は3つであると思います。メッセージIDまたは文字列、重大度コード、状態コードの順になります。 。ほとんどの場合、これらの最後の2つの値は、それぞれ16と1のようになります。

于 2012-07-13T20:04:14.280 に答える
0

私はそれをより見やすくするためにここに答えを置きます。ありがとう。

SQL Server 2012に移行しているため、両方のトリガー(更新と削除)をRAISERRORからTHROWに変更する必要があります。これを行うには、行(両方)をTHROW @ errno、@ errmsg、2に変更する必要があります。- おばけ

于 2012-07-13T23:54:31.983 に答える