Considere o seguinte código
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
Se executarmos isso
INSERT INTO TestView1 (Column1, Column2, NewColumn)
SELECT Column1, Column2, NewColumn FROM ImportTest1
Ele falha com erro
Update or insert of view or function 'TestView1' failed because it contains a derived or constant field.
No entanto, se eu fizer a mesma coisa através do BCP, funciona bem
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,
O que está acontecendo aqui que permite que o BCP importe com sucesso por meio da exibição, mas não podemos executá-lo manualmente?
bcp
é um aplicativo de API ODBC.Ele faz coisas no estilo de aplicativo, em vez de ser um simples comando T-SQL:
No seu exemplo, o bcp executa:
Então, essencialmente, está trabalhando em quais colunas são válidas para inserir antes de executar a inserção em massa (usando a sintaxe da API).