1

数値を抽出するために varchar 値を解析している状況があり、テーブルを更新して数値をテーブルの新しいフィールドに入れる必要があります。文字列の解析をストアド プロシージャにカプセル化しました。今、更新ステートメントを書き込もうとしています。

MY テーブルは次のようになります (キー値のみを示すために単純化されています)。

CREATE TABLE dbo.oper_pacer
(
oper_pacer_id                 int         NOT NULL,
oper_pacer_fluroscopy         varchar(20) NULL,
oper_pacer_fluoro_min         float       NULL
)

私の関数は varchar(20) 値を取り、フロートを返し、数値の解析と変換を行います:

CREATE FUNCTION usf_ParseFluoro( 
@parm1 VARCHAR(20)
)
RETURNS FLOAT
AS
BEGIN
    DECLARE @value VARCHAR(20)
    DECLARE @midVal VARCHAR(20)
    DECLARE @nPos INT
    DECLARE @lPos INT

SELECT @midVal = SUBSTRING(@parm1, PATINDEX('%[0-9]%', @parm1), PATINDEX('%[0-9]%',@parm1) + LEN(@parm1)+1)

SELECT @value = 
    (CASE 
        WHEN PATINDEX('%[a-z]%', @midVal) = 0
            THEN @midVal
        ELSE RTRIM(SUBSTRING(@midVal, 1, PATINDEX('%[a-z]%', @midVal)-1))
    END)

    RETURN CONVERT(FLOAT, @value)
END

これが私の問題です:

T-SQL で for each ループを実行する方法がない場合、ループして関数を呼び出し、戻り値を oper_pacer_fluoro_min に入れるために、元のテーブルの更新をどのように記述すればよいでしょうか?

編集: 関数を作成したら、更新はかなり単純で、試行錯誤が少しありました: dbo を入れる必要がありました。関数のプレフィックスを追加して、現在の DB 権限で実行できるようにします。

UPDATE oper_pacer SET oper_pacer_fluoro_min = dbo.usf_ParseFluoro(oper_pacer_fluroscopy)
4

1 に答える 1

2

手順を使用してそれを行うことはできないと思います。関数を使用して同様の問題を解決しましたが、あなたにも役立つと思います。関数で必要なすべてのデータ要素を使用できるように、(一時テーブルにある場合でも) テーブルを再構築する必要がある場合があります。しかし、一度それを行うと、UPDATE ステートメントは入力フィールドの関数呼び出しにすぎません。

于 2012-09-18T17:47:49.463 に答える