In SQL Server (at least 2008 and above) you can insert multiple rows at one time through a single INSERT
statement:
INSERT INTO mytable (column1, column2) VALUES (value1, value2), (value3, value4);
I don't know if there is a limit (such as 1000) on the number of rows that can be inserted at once, but I agree with @RhysJones that you might want to limit to, say, 100 rows at a time in case an error is encountered - this will make it much easier to spot the error and correct it.
Since you're using ColdFusion, my recommendation would be to loop over the rows of the external file 100 at a time:
<cfquery name="q_insert_rows">
INSERT INTO mytable ( column1, column2, column3 )
VALUES
<cfloop query="external_data" startrow="#startrow#" endrow="#endrow#">
( <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value1#" />
, <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value2#" />
, <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#value3#" /> )
<cfif currentRow NEQ endrow> , </cfif>
</cfloop>
</cfquery>
The <cfquery>
block above should be put inside a loop:
<cfloop from="1" to="#external_data.recordCount#" step="100" index="startrow">
<cfset endrow = min(startrow + 99, external_data.recordCount) />
...
</cfloop>
If you want the whole thing to fail if one insert fails, then wrap the above loop in <cftransaction>
.