Sql-Server

BCP 通過視圖插入與手動插入

  • April 9, 2022

考慮以下程式碼

use tempdb
go

drop table if exists ImportTest1;
create table ImportTest1 (
Column1    int null,
Column2 int null,
NewColumn int null
);
insert into ImportTest1 select 1,2,3 union select 4,5,6;
select * from ImportTest1;

drop table if exists DestinationTest1;
create table DestinationTest1 (
Column1 int null,
Column2 int null
);
select * from DestinationTest1;
GO

CREATE OR ALTER VIEW TestView1 AS 
SELECT Column1 AS Column1, Column2 AS Column2, NULL AS NewColumn FROM DestinationTest1
GO

如果我們執行這個

INSERT INTO TestView1 (Column1, Column2, NewColumn)
SELECT Column1, Column2, NewColumn FROM ImportTest1

它失敗並出現錯誤

Update or insert of view or function 'TestView1' failed because it contains a derived or constant field.

但是,如果我通過 BCP 做同樣的事情,它工作正常

BCP "SELECT Column1, Column2, NewColumn FROM tempdb..ImportTest1" QUERYOUT C:\BCPTest\test.txt -T -c -t,

BCP tempdb..TestView1 IN C:\BCPTest\test.txt -T -c -t,

這裡發生了什麼,允許 BCP 通過視圖成功導入,但我們不能手動執行它?

bcp是一個 ODBC API 應用程序。

它做應用程序風格的事情,而不是一個簡單的 T-SQL 命令:

在您的範例中, bcp 執行:

exec sp_describe_first_result_set N'select * from tempdb..TestView1'

declare @p1 int
set @p1=1
exec sp_prepare @p1 output,NULL,N'select * from tempdb..TestView1',1
select @p1

insert bulk tempdb..TestView1([Column1] int,[Column2] int)

exec sp_unprepare 1

所以本質上,它是在執行批量插入之前確定哪些列是有效的插入(使用 API 語法)。

引用自:https://dba.stackexchange.com/questions/310718