如何以表格格式调用我的输出以便我可以查询它?
Posted
技术标签:
【中文标题】如何以表格格式调用我的输出以便我可以查询它?【英文标题】:How do I call my output in a table format so that I can query it? 【发布时间】:2019-10-04 18:33:12 【问题描述】:格式化的代码集以表格格式为我提供输出。 我需要想出一种方法来命名这组代码,就像我们命名一个表一样。
我需要在另一个表中插入我的输出值。
这似乎是一项简单的任务,但我不知道如何插入名称。
exec sp_xml_preparedocument @xmlhandle output, @Data1, @Data2
我尝试使用此 ^ 调用程序,但仅执行此语句并没有给我输出。
这就是程序的样子。
declare @Data1 xml, @Data2 xml
select @Data1 =
(
select *
from (select * from Test1 except select * from Test2) as a
for xml raw('Data')
)
select @Data2 =
(
select *
from (select * from Test2 except select * from Test1) as a
for xml raw('Data')
)
;with CTE1 as (
select
T.C.value('../@ID', 'bigint') as ID,
T.C.value('local-name(.)', 'nvarchar(128)') as Name,
T.C.value('.', 'nvarchar(max)') as Value
from @Data1.nodes('Data/@*') as T(C)
), CTE2 as (
select
T.C.value('../@ID', 'bigint') as ID,
T.C.value('local-name(.)', 'nvarchar(128)') as Name,
T.C.value('.', 'nvarchar(max)') as Value
from @Data2.nodes('Data/@*') as T(C)
)
select
isnull(C1.ID, C2.ID) as ID, isnull(C1.Name, C2.Name) as Name, C1.Value as Value1, C2.Value as Value2
from CTE1 as C1
full outer join CTE2 as C2 on C2.ID = C1.ID and C2.Name = C1.Name
where
not
(
C1.Value is null and C2.Value is null or
C1.Value is not null and C2.Value is not null and C1.Value = C2.Value
)
P.S 如果我不能很好地解释这个问题,我很抱歉。我仍在学习。
【问题讨论】:
为什么不直接使用另一个 CTE?或者,也许我不明白你想在这里做什么。也许您需要在调用代码中使用变量? 您的表是否已经存在?如果是这样,您是要添加还是删除它并仅使用这些最新数据创建一个新的? 需要用一条语句调用整个程序。我需要为这个程序命名,以便以后可以使用该名称来查询结果。如果你得到它,请告诉我。 @SeanLange 我的表已经存在。我需要添加它。我需要将此代码的输出添加到该表中。 @CaiusJard @YitzhakKhabinsky,一个小小的提示:有一些不错的magic in comments。例如,表达式[mcve]
将自动翻译为您的链接。我在这里做这个:minimal reproducible example
【参考方案1】:
您似乎是在说您的代码工作正常,您在 SSMS 中运行存储过程并在网格中生成您想要的结果。您只是希望它进入现有表而不是 SSMS 结果网格
这可能就像在 CTE 和 SELECT 之间添加 INSERT INTO table
一样简单:
with CTE1 as (
select
T.C.value('../@ID', 'bigint') as ID,
T.C.value('local-name(.)', 'nvarchar(128)') as Name,
T.C.value('.', 'nvarchar(max)') as Value
from @Data1.nodes('Data/@*') as T(C)
), CTE2 as (
select
T.C.value('../@ID', 'bigint') as ID,
T.C.value('local-name(.)', 'nvarchar(128)') as Name,
T.C.value('.', 'nvarchar(max)') as Value
from @Data2.nodes('Data/@*') as T(C)
)
INSERT INTO table
select
isnull(C1.ID, C2.ID) as ID, isnull(C1.Name, C2.Name) as Name, C1.Value as Value1, C2.Value as Value2
from CTE1 as C1
full outer join CTE2 as C2 on C2.ID = C1.ID and C2.Name = C1.Name
where
not
(
C1.Value is null and C2.Value is null or
C1.Value is not null and C2.Value is not null and C1.Value = C2.Value
)
如果查询没有输出一组与表中的列相同的列,则命名要插入的列:
INSERT INTO table (theId, theName, theValue1, theValue2)
无论如何,明确表示可能是个好主意,因为如果将来有人向您的表中添加一列,它肯定会破坏您的过程。如果您明确指出它可能仍然会破坏的列,但不是确定它只会在有人添加“NOT NULL”的列并且他们没有指定列默认值是什么时才会破坏
【讨论】:
很确定这是他们正在寻找的东西,但很难说。如果没有其他例外猜测,请向我 +1。 :D 是的,看看他现在回来说“我违反了 pk”:) 是的,这正是我想做的。我知道这是我错过的非常小的东西。我的错。这就像一个魅力。 @CaiusJard以上是关于如何以表格格式调用我的输出以便我可以查询它?的主要内容,如果未能解决你的问题,请参考以下文章