想象一下,里面有一百个不同的列.想象一下,我有一个用户数据表,我希望将数据复制到基表.所以我写了这个简单的insert-select语句,弹出这个错误.那么,找出哪一列引起错误的最优雅的方法是什么?
我对解决方案的初步想法是将它包装在一个事务中,我将最终回滚并使用一种Divide and Conquer方法:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
Run Code Online (Sandbox Code Playgroud)
而这显然失败了.所以我们将列集分成两半,如下所示:
begin tran
insert into BaseTable (c1,c2,c3,...,cK) --where K = N/2
select c1,c2,c3,...,cK --where K = N/2
from UserTable
rollback tran
Run Code Online (Sandbox Code Playgroud)
如果失败则失败的列在另一半.我们继续这个过程,直到找到讨厌的专栏.
还有什么比这更优雅的?
注意:我也发现了这个问题的近乎重复,但它几乎没有答案.
我正试着加入两张桌子.我遇到的问题是我正在尝试加入的列之一是列表.
因此可以使用"IN"而不是"="来连接两个表.沿着这条路线
SELECT ID
FROM tableA INNER JOIN
tableB ON tableB.misc IN tableA.misc
WHERE tableB.miscTitle = 'help me please'
tableB.misc = 1
tableA.misc = 1,2,3
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有一个xml列,我想在相邻的列中保留一个节点计数.
例如,在下面给出的xml中,我有3个节点a,所以我想输出它.
但是,我遇到的问题是我无法创建一个通用的模式绑定函数,该函数将使用@xml和@nodeName以返回指定节点的计数.
create function dbo.fnXmlCount_a (@xml xml)
returns int with schemabinding
as begin
return (@xml.value('count(//a)', 'int'))
end
declare @xml xml;
set @xml = '
<r>
<a></a>
<b></b>
<a></a>
<c>
<a></a>
</c>
</r>'
select dbo.fnXmlCount_a(@xml) aCount
Run Code Online (Sandbox Code Playgroud)
最后一次操作的结果是:
aCount
3
Run Code Online (Sandbox Code Playgroud)
然后我在该表上创建一个具有此xml字段的列,如下所示:
alter table [XmlTable] add column [aCount] as (dbo.fnXmlCount_a([xml])) persisted
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是:
alter table [XmlTable] add column [aCount] as (dbo.fnXmlNodeCount([xml], 'a')) persisted
Run Code Online (Sandbox Code Playgroud)
谢谢!
更新:
我们都知道这//很慢,所以如果你能弄清楚如何通过这条路径来搜索另一个变量,那就太好了.默认情况下,此搜索路径将是//.