2

このようなリストがありますthing1、thing2、thing3。そして、それらを同じ外部キーを持つルックアップ テーブルに挿入したいと考えています。したがって、理想的には次のようになります。

<cfquery datasource="#ds#" result="insert_things">
    INSERT INTO lkp_things (foreign_key, thing) VALUES
    (1, thing1), (1, thing2), (1, thing3)
</cfquery>

これを達成する唯一の方法は、リストをクエリに変換することのようですが、もっと簡単な方法はありますか?

これが私が試したことです:

<cfquery datasource="#ds#" result="insert_things">
    INSERT INTO lkp_things (foreign_key, thing) VALUES
    <cfloop list="#things#" index="thing">
        (#id#,#thing#)<cfif ?????? NEQ len(#things#)>,</cfif>
    </cfloop>
</cfquery>

cfquery 内で cfloop を実行できないと聞いたことがありますが、VALUES の末尾にカンマを付けることができないため、それが本当かどうかさえわかりません。 cfloop 内の現在の反復回数」。リストをクエリに変換すると、currentRow を実行できますが、すべてを実行する前に、これを達成するためのより簡単な方法があるかどうかを知りたいと思います。

また、私は CF 8 と sql server '08 を使用しています。編集: 申し訳ありませんが、実際には 2000 を使用しています。

4

4 に答える 4

2

カウンターを追加して、ループ内でインクリメントします。また、アイテムの数を取得するには、リストlistLen()ではなく使用する必要があります。len

<cfquery datasource="#ds#" result="insert_things">
  INSERT INTO lkp_things (foreign_key, thing) VALUES
  <cfset count = 1>
  <cfloop list="#things#" index="thing">
    (
     <cfqueryparam cf_sql_type="cf_sql_integer" value="#id#">,
     <cfqueryparam cf_sql_type="cf_sql_varchar" value="#thing#">
    )<cfif count NEQ listLen(things)>,</cfif>
   <cfset count++>
  </cfloop>
</cfquery>

すべての値で使用する必要がcfqueryparamあります。列のタイプを推測しました。

于 2013-10-25T14:03:59.073 に答える
1

データベースエラーが発生しました

INSERT INTO lkp_things (foreign_key,thing) 
VALUES (1,'thing1'),(1,'thing2')

Leigh のおかげで、私が実際に SQL Server '00 を使用していて、そのバージョンではこの挿入方法が許可されていないことに気付きました。だから、私はこれを使用しなければなりませんでした:

INSERT INTO lkp_things (foreign_key,thing)
SELECT 1,'thing1'
    UNION ALL
SELECT 1,'thing2'

CF では次のようになります。

<cfset thingArray = listToArray(form.things,",")>
<cfquery datasource="aliaba_jdbc" name="insert_courses">
    INSERT INTO lkp_Things (id,thing)
    <cfloop from="1" to="#arrayLen(thingArray)#" index="x">
        SELECT <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#form.id#">,<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#thingArray[x]#">
        <cfif x lt arrayLen(thingArray)>UNION ALL</cfif>
    </cfloop>
</cfquery>

ここでこの解決策を見つけました:ステートメントの「INSERT INTO dbo.Blah」部分を繰り返さずに複数の行を挿入するにはどうすればよいですか?

于 2013-10-25T17:59:42.783 に答える
0

この回答はマットの回答に似ていますが、条件付きロジックを使用していません。

<cfquery>
insert into lkp_things (foreign_key, thing)
select 0, ''
where 1=2
<cfloop list="#things#" index="thing">
union
select <cfqueryparam cf_sql_type="cf_sql_integer" value="#id#">
, <cfqueryparam cf_sql_type="cf_sql_varchar" value="#thing#">
</cfloop>

どちらの回答も、id 変数が変更されず、別の場所に設定されていることを前提としています。

于 2013-10-25T14:16:39.790 に答える