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