0

テーブル全体を更新するクエリは次のようになります。

update works set nIndex = cast(replace(replace((select strIndex 
 from works), char(10), ''), char(10), '') as int)

ただし、実行すると次のエラーが発生します。

「サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。」

.

4

5 に答える 5

2

サブセレクトは必要ありません。これを試して:

update works
     set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)

サブセレクトは、各行を更新するためにすべての値を返していました。strIndexそれはやり過ぎです。1 行内の値に対してcastandを実行するだけです。replace

于 2013-03-07T00:41:14.077 に答える
1

エラーが示すように、ここで複数のレコードを返しています。

select strIndex from works

したがって、works テーブル内のすべての strIndex 値で単一の値を更新しようとしています。これは機能しません。

これを機能させる方法は、何をしようとしているのかによって異なります。ここでは詳しく説明していないため、何がエラーを修正するかについては推測しません。

于 2013-03-07T00:40:28.427 に答える
0

char(10)他の回答に加えて、 2回交換するつもりはなかったと思います。おそらく必要なのは、との両方を置き換えることchar(10)ですchar(13)

UPDATE dbo.works 
  SET nIndex = CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), ''));

もちろん、strIndexは文字列であるため、CR / LF以外の文字が含まれる可能性があるため、次のWHERE句を追加することをお勧めします。

WHERE ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1;

またはCASE、更新で式を使用して、互換性のない値が次のように設定されていることを確認できますNULL。例:

UPDATE dbo.works 
  SET nIndex = CASE 
    WHEN ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1
  THEN 
    CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), '')) 
  ELSE NULL END;

SQL Server 2012では、このロジックははるかに単純TRY_CONVERT()です。

于 2013-03-07T01:16:45.267 に答える
0

サブクエリにTOP1を追加することもできます。これにより、そのエラーが修正されます。

update works set nIndex = cast(replace(replace((select TOP 1 strIndex 
from works), char(10), ''), char(10), '') as int)

しかし、コンテキストがないため、結果が期待どおりであることを保証するものではありません。

于 2013-03-07T00:53:34.510 に答える
0

あなたが持っているエラーは、基本的に、nIndex にいくつかの結果を取得しようとしていることを示しています。これは、次の結果であるためです。

あなたが言っているすべてのキャストと置換を忘れると: nIndex = (1, 2, 3, 4,...) 値を 1 つしか指定できないため、これは不可能です。

これが機能するには、結果を制限する何かが必要です: select strIndex from works WHERE PRIMARY_KEY = SOMETHING これは問題を解決する効率的な方法ではありませんが、理解する必要があります。

2 つの列が同じテーブルにあるため、これはまったく必要なく、次のように簡単に実行できます。

更新作業 set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int)

于 2013-03-07T01:03:27.827 に答える