Tsql 通过dapper插入的sql查询以一种方式工作,但不能以另一种方式工作(包括查询)

Tsql 通过dapper插入的sql查询以一种方式工作,但不能以另一种方式工作(包括查询),tsql,dapper,Tsql,Dapper,一个查询出现了奇怪的错误,但另一个却没有,我不知道为什么一个查询有效,而另一个查询无效。 顺便说一句,第二条Insert语句处理FieldA=single value@var1、FieldB=values数组和FieldC=single value@param3 还有一点是,FieldA+FieldB是复合唯一约束(但不是外键) 工作版本: Declare @var1 int Insert into table1 (field1, field2) values (@param1, @param

一个查询出现了奇怪的错误,但另一个却没有,我不知道为什么一个查询有效,而另一个查询无效。 顺便说一句,第二条Insert语句处理FieldA=single value@var1、FieldB=values数组和FieldC=single value@param3

还有一点是,FieldA+FieldB是复合唯一约束(但不是外键)

工作版本:

Declare @var1 int 
Insert into table1 (field1, field2) values (@param1, @param2); select @var1 = SCOPE_IDENTITY()

Insert into table2
Select FieldA = @var1, FieldB = Id, FieldC = @param3 from table3 where FieldD = @param4;

Select @var1; 
错误版本(没有什么不同,只是字段A、B、C对齐):

看起来您(错误地!)假设您在
insert….select
语句的
select
子句中使用的别名决定了值将进入哪些列—好吧,它不是这样工作的

就像使用
insert…values
一样,您应该在
insert
子句中指定列列表(即使它是可选的),并且就像在
values
子句中一样,
select
子句返回的列的顺序意味着它们将进入哪些列

事实上,
insert…select
子句中的别名除了作为可读性辅助外没有任何意义-数据库将忽略它们-但是如果它们有助于可读性,那么无论如何保留它们可能不是一个坏的选择

第一个版本只是偶然工作的-因为
select
子句中列的顺序与表中列的顺序匹配-或者最糟糕的是,它不匹配,但不匹配列的数据类型与select列表中列的顺序兼容,这意味着您插入了错误的数据,但没有得到任何指示

正确的代码如下(省略第一条insert语句):

这样,您的
insert…select
语句就不依赖于表本身中列的顺序,并且在向表中添加列(除非添加不可为空且没有默认值的列)或更改表中列的顺序时不会中断(我同意这不太可能,但我已经看到了,比你预期的要多)。

看起来你(错误地!)假设,
insert…select
语句的
select
子句中使用的别名决定了值将进入哪些列-好吧,这不是它的工作方式

就像使用
insert…values
一样,您应该在
insert
子句中指定列列表(即使它是可选的),并且就像在
values
子句中一样,
select
子句返回的列的顺序意味着它们将进入哪些列

事实上,
insert…select
子句中的别名除了作为可读性辅助外没有任何意义-数据库将忽略它们-但是如果它们有助于可读性,那么无论如何保留它们可能不是一个坏的选择

第一个版本只是偶然工作的-因为
select
子句中的列顺序与表中的列顺序匹配-或者最糟糕的是,它不匹配,但不匹配的列的数据类型与select列表中的列顺序兼容,这意味着您插入了wron在没有任何迹象的情况下收集数据

正确的代码如下(省略第一条insert语句):


这样,您的
insert…select
语句就不依赖于表本身中列的顺序,并且在向表中添加列(除非添加不可为空且没有默认值的列)或更改表中列的顺序时不会中断(我同意这是不可能的,但我已经看到了,比你预期的更频繁)。

你得到的错误是什么?顺便说一句,整洁与此无关…你得到的错误是什么?顺便说一句,整洁与此无关。。。
Declare @var1 int 
Insert into table1 (field1, field2) values (@param1, @param2); select @var1 = SCOPE_IDENTITY()

Insert into table2
Select FieldA = @var1, FieldC = @param3, FieldB = Id from table3 where FieldD = @param4;

Select @var1; 
Insert into table2(FieldA, FieldB, FieldC)
Select @var1, Id, @param3 from table3 where FieldD = @param4;
Insert into table2(FieldA, FieldC, FieldB)
Select @var1, @param3, Id from table3 where FieldD = @param4;