AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-279

ChrisF's questions

Martin Hope
ChrisF
Asked: 2023-01-07 04:01:07 +0800 CST

无法从存储在表列中的 XML 中读取数据

  • 7

我有一些数据以 XML 格式存储在表中:

<AccountTypes xmlns="">
  <Id>1003</Id>
  <Id>2</Id>
  <Id>3</Id>
  <Id>1004</Id>
  <Id>1002</Id>
  <Id>0</Id>
</AccountTypes>

这是以前仅在 C# 代码中处理的遗留数据,因此无法更改。

我现在需要阅读它并在存储过程中处理它。到目前为止,我有以下代码:

DECLARE @accountTypes XML
SELECT @accountTypes = DT.AccountTypes FROM dbo.DataTable AS DT
WHERE DT.Id = 1016

DECLARE @hdoc int
    
EXEC sys.sp_xml_preparedocument @hdoc OUTPUT, @accountTypes
SELECT *
FROM OPENXML (@hdoc, '/AccountTypes/Id')
WITH(
    Id VARCHAR(10) 'Id'
    )

EXEC sys.sp_xml_removedocument @hdoc

然而,它的输出只是空值行:

Id
NULL
NULL
NULL
NULL
NULL
NULL

而不是我期望的 id 值。

无论是否包含colpattern('Id') 或是否在命令中设置flags参数,我都会得到相同的结果。OPENXML

我可以对当前形式的数据做些什么来从 XML 中获取实际值吗?

sql-server
  • 2 个回答
  • 96 Views
Martin Hope
ChrisF
Asked: 2020-12-05 03:29:41 +0800 CST

防止 SQL 明显执行昂贵的子查询

  • 0

我有一个形式的存储过程:

CREATE PROCEDURE StoredProcedure
    @SearchString NVARCHAR(MAX),
    @ComparisonType INT
AS
BEGIN

    SELECT  A.Value1,
            B.Value1,
            C.Value1,
            ...
    FROM TableA as A
    INNER JOIN TableB as B on B.Key1 = A.Key1
    INNER JOIN TableC as C on C.Key2 = B.Key2
    WHERE A.DateValue > '2020-10-01'
    And 1 = CASE @SearchString
        WHEN N'' THEN 1
        ELSE
            CASE @ComparisonType
                WHEN 0 THEN -- potentially expensive query 1 referencing TableC
                WHEN 1 THEN -- potentially expensive query 2 referencing TableC
                WHEN 6 THEN -- potentially expensive query 3 referencing TableC
                WHEN 8 THEN -- potentially expensive query 4 referencing TableC
                WHEN 10 -- potentially expensive query 5 referencing TableC
                ELSE 0
            END
        END
END

即使在@SearchString设置为N''查询的情况下调用它也需要一分半钟的时间来执行。如果我删除“可能很昂贵的查询”部分,那么查询几乎会立即返回预期的数据。

从我所读到的内容来看,上述内容不应该评估外部语句ELSE部分中的任何内容,那么为什么它表现得好像它是一样的呢?CASE@SearchStringN''

如果这按预期工作,那么我如何编写代码以强制 SQL 不执行“可能昂贵的查询”部分?

尽管我努力确保根本不调用它们,但我试图理解为什么它们似乎会影响主查询。

sql-server query-performance
  • 2 个回答
  • 110 Views
Martin Hope
ChrisF
Asked: 2019-03-13 03:54:34 +0800 CST

如何覆盖报表中参数的默认值?

  • 1

我有一个带有参数的报告,该参数通常通过运行将另一个参数作为输入的查询来获取其默认值。当报告以交互方式运行时,这很好用。

但是,我需要从所有过滤器都由代码提供的代码中调用此报告。我为其他参数编写的代码工作正常:

   string report = "Analysis/Report.aspx?ReportPath=/MyReport";
   string fullReportPath = string.Format("{0}&LocationId={1}&BatchNumber={2}&SearchReference={3}", report, locationId, batchNumber, reference);
   RunReport(fullReportPath);

有一个下拉列表,其中可用值和默认值都是通过以locationId为参数的查询从数据库中检索的。这是默认情况下选择所有值。

我需要在报告和/或代码中更改什么才能像现在一样工作,并且我可以为该下拉列表提供选定的值作为参数?

我发现这篇博文在设置其他参数的值时使用内部或隐藏控制参数的概念,但给出的示例只是将其他参数设置为默认值或将其留空。我需要参数来运行当前查询。

sql-server reporting
  • 1 个回答
  • 940 Views
Martin Hope
ChrisF
Asked: 2017-02-25 06:21:34 +0800 CST

如何将超过 256 个字符输出到文件?

  • 3

我正在使用以下命令将存储过程的输出写入文件以进行进一步处理:

DECLARE @shellCommand VARCHAR(2000)
SET @shellCommand = 'SQLCMD -S ' + @@SERVERNAME + ' -d ' + @dbName + ' -U ' + @UserName + ' -P ' + @Password + ' -Q "' + @sqlCommand + '" -s "," -h -1 -k 1 -W -o "' + @outputfileName + '"'

@sqlCommand正确设置为“EXEC StoredProcedureName parameterValue”,并且在独立运行时显然会产生正确的数据。

我遇到的问题是其中一个字段包含长度超过 256 个字符的文本,并且在通过 SQLCMD 命令输入时被截断。

在阅读文档时,我看到默认列宽是 256 个字符。所以我正在考虑使用-yor-Y选项来允许输出超过 256 个字符。-W但是,这些选项与我用来从输出中删除尾随空格的选项不兼容。我开始使用-y 0(尽管有性能警告 - 一旦我得到输出工作,我可以查看性能)。然而,这会产生一些奇怪的结果。

该文件由一个标题行和后面的数据行组成,应该如下所示:

First,ABC,Number,String,ReallyLongString,...
A,0123,14.99,"Short string","Longish string",...
B,0456,23.99,"Normal string","Really, really long string that's causing problems",...

使用该-W选项,文件格式正确,但很长的字符串被截断。我们发现它的原因是因为"缺少尾随并且文件没有被正确读取。

随着-y 0非常长的字符串得到输出,但大量空格被添加到明显随机的列中。我们得到这样的东西:

First,ABC ,Number    [...]      ,String,ReallyLongString,...
A    ,0123,14.99     [...]      ,"Short string","Longish string",...
B    ,0456,23.99     [...]      ,"Normal string","Really, really long string that's causing problems",...

(“数字”和由“[...]”表示的下一列之间还有很多很多的空格,我只是展示了一些)。

还有更多的数值必须以类似的方式进行格式化,而且似乎正是这些数值导致了值之后和下一个逗号之前的额外空格。我们可以忍受一些额外的空间,但不能像这样多,因为结果文件太大而无法被目标程序读取。

数据由如下所示的存储过程生成:

SELECT
    'First' AS First,
    'ABC' AS ABC,
    'Number' AS Number,
    'String' AS String,
    'ReallyLongString' AS ReallyLongString,
    ...

UNION ALL

SELECT
    'A' as First,
    Column1 as ABC,
    REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct
    '"' + Column3 + '"' as String,
    '"' + Column4 + '"' as ReallyLongString,
    ....
FROM Table
WHERE <condition>

我认为问题是存储过程的输出。由于输出了额外的尾随空格,我只向-WSQLCMD 添加了该选项,但是查看存储过程我无法确定它们的来源。我将数字格式更改为包括RTRIM:

RTRIM(REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', ''))

但这似乎没有什么区别。

我可以对存储过程做些什么,或者是否有 SQLCMD 的选项组合可以产生所需的输出?还是我必须找到其他方法来生成这个文件?

sql-server csv
  • 3 个回答
  • 7454 Views
Martin Hope
ChrisF
Asked: 2016-08-27 02:23:57 +0800 CST

第三张表的条件连接

  • 0

我有四张桌子 - A、B、C 和 D。

表 A 保存库存移动记录,表 B 保存每个项目的销售记录,表 C 保存每个项目的非销售记录,表 C 保存非销售移动的类型。

对于 A 中的每条记录,B 中都有一行或 C 中的一行。因此,为了获得每个项目的单行动作,我执行以下操作:

select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C on C.Id = A.IdIntoC

到目前为止,一切都很好。但是,因为我需要知道它在 C 中的运动类型,所以我想返回以下内容:

ItemId, Date, Sales, Goods In, Returns to Supplier

即,有单独的栏目来表示收货和退回给供应商的货物。

类型(货物进入或返回供应商)存储在 D 中,并且 C 和 D 之间存在多对一关系,因为 D 是对 C 中的项目进行分组的“文档”。

如果我做:

select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC
    left join D on D.Id = C1.IdIntoD and D.Type = 1
left join C as C2 on C2.Id = A.IdIntoC
    left join D on D.Id = C2.IdIntoD and D.Type = 2

我只是得到重复的行,因为从 A 到 C 的两个连接实际上是相同的。

我想做的是这个(非法律语法):

select column1, column2, ... from A
left join B on B.Id = A.IdIntoB
left join C as C1 on C1.Id = A.IdIntoC and D.Type = 1
    left join D on D.Id = C1.IdIntoD
left join C as C2 on C2.Id = A.IdIntoC and D.Type = 2
    left join D on D.Id = C2.IdIntoD

基本上我想根据 D 中的值分离 A 和 C 之间的连接。我知道left join每次都必须在 C 和 D 之间使用 a ,否则我将得不到任何数据,但从逻辑上讲,这就是我觉得我需要做的.

我该怎么做呢?

sql-server join
  • 1 个回答
  • 2301 Views
Martin Hope
ChrisF
Asked: 2014-10-14 04:44:39 +0800 CST

以下哪段 SQL 是最有效的

  • 3

我需要将日期部分添加GetDate()到存储的时间部分DateTime。

天真地我以为我可以做到以下几点:

declare @testTime DateTime = '2013-04-23 13:55:06'
select cast(getdate() as date) + cast(@testTime as time)

但这会出现以下错误:

操作数数据类型 date 对于 add 运算符无效。

我做了更多的研究,并提出了三种可能的计算方法:

declare @testTime DateTime = '2013-04-23 13:55:06'

select dateadd(dd, 0, DATEDIFF(dd, 0, GetDate())) + cast(@testTime as time)

select cast(cast(GetDate() as date) as datetime) + cast(@testTime as time)

select dateadd(day, datediff(day, @testTime, GetDate()), @testTime)

这三种方法都产生相同的结果,但我对实施它们中的任何一种都不是 100% 满意,尽管第三种方法似乎是更好的方法——尽管我没有证据证明这一点。

三者中哪一个(如果有的话)效率最高?

有没有更好的办法?

sql-server sql-server-2012
  • 2 个回答
  • 725 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve