如何以表格格式调用我的输出以便我可以查询它?

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

以上是关于如何以表格格式调用我的输出以便我可以查询它?的主要内容,如果未能解决你的问题,请参考以下文章

OpenOffice Calc 时间转换

如何以表格形式输出

QTableWidget的列文本格式如何设置?

访问 VBA 以表格格式将查询结果发送到 Outlook 电子邮件

如何编写我的 C++ 函数以便我可以从 C# 调用它?

如何将 Laravel 输出的日期格式更改为 JSON?