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-4149

GWR's questions

Martin Hope
GWR
Asked: 2019-11-23 05:22:37 +0800 CST

如果它有行,则仅从存储过程返回记录集

  • 3

我有一个存储过程,它返回多个记录集以在应用程序中使用。有时其中一些记录集是空的。

我想减少开销,只返回那些有 1 行或更多行的。

我的问题是 - 我怎样才能只返回那些有行的记录集?

应用程序只需要 0 个或多个记录集,然后循环遍历每个记录集,然后将它们打印出来。

我知道我可以在应用程序代码中跳过它们,但我试图阻止它们被返回,如果它们为空的话。

程序很简单:

CREATE PROCEDURE bfsp_PROC_NM
AS 

    BEGIN

        SELECT * FROM TABLE_1

        SELECT * FROM TABLE_2

        SELECT * FROM TABLE_3

        RETURN  

    END
GO

在实际过程中,有些查询很昂贵,所以我不想测试查询,如果它返回一行或更多,请再次执行......因为它太昂贵了。

sql-server t-sql
  • 3 个回答
  • 2690 Views
Martin Hope
GWR
Asked: 2019-06-01 02:11:01 +0800 CST

Varchar 上的 MySQL 区分大小写连接

  • 2

我有两个表,它们都具有相同的数据类型、字符集和明确指定的排序规则。

CLERK CHAR(3) CHARACTER SET latin1 COLLATE latin1_bin NULL

对于字段上区分大小写的联接CLERK,我是否还需要在联接子句中指定排序规则,或者它在 DDL 级别指定的事实是否意味着联接中不需要它?

FROM
    CUSTOMER S JOIN 
    CLERK C ON S.CLERK = C.CLERK COLLATE latin1_bin
mysql mysql-5.7
  • 1 个回答
  • 1704 Views
Martin Hope
GWR
Asked: 2017-12-18 08:37:55 +0800 CST

使用可以跨越一天的日期时间戳对会话进行分组

  • 2

我正在处理具有随时间回收的会话 ID 值的数据(确切地说是来自 IIS 的 asp 会话 ID)。

我试图给他们一个序列,这样 ASP_SESSION_ID 的每个实例就不会组合在一起。

例如,数据看起来像这样。相同的会话 ID,在 2016 年 8 月使用,然后在 2017 年 3 月再次使用。

DTTM                        SESSION_ID
2016-08-29 14:24:28.450     297692378
2017-04-13 23:54:53.760     297692378
2017-04-13 23:59:53.477     297692378
2017-04-14 00:04:52.897     297692378
2017-04-14 00:04:53.790     297692378

起初我想只按日期分组(在 DAY 级别),但对于上面的示例,请注意会话 ID 的第二个实例是如何跨越午夜的。这将导致第三组,而实际上是同一个会话。

因此,如果我能正确地对它们进行排名,那将是:

DTTM                        SESSION_ID      RANK
2016-08-29 14:24:28.450     297692378       1
2017-04-13 23:54:53.760     297692378       2
2017-04-13 23:59:53.477     297692378       2
2017-04-14 00:04:52.897     297692378       2
2017-04-14 00:04:53.790     297692378       2

此处,当自上次请求以来超过 20 分钟后,ASP_SESSION_ID 应被视为会话的新实例。

那么,随着时间的推移,我如何对相同的 ASP_SESSION_ID 进行分组或对其进行不同的排名?例如,如果该 ASP_SESSION_ID 的下一个请求距离上一个请求 > 20 分钟,则将其分组/排名不同?

我只是不确定如何解决这个问题。

以下是生成上述数据的一些语句:

CREATE TABLE #TEST
(
DTTM DATETIME, 
SESSION_ID INT
)

INSERT INTO #TEST (DTTM, SESSION_ID)
select '2016-08-29 14:24:28.450', 297692378 union
select '2017-04-13 23:54:53.760', 297692378 union
select '2017-04-13 23:59:53.477', 297692378 union
select '2017-04-14 00:04:52.897', 297692378 union
select '2017-04-14 00:04:53.790', 297692378 
sql-server t-sql
  • 1 个回答
  • 104 Views
Martin Hope
GWR
Asked: 2017-11-30 04:32:27 +0800 CST

存储 HASHBYTES('MD5', ...) 结果的最佳数据类型

  • 9

存储结果的最佳数据类型是HASHBYTES('MD5', ...)什么?

它输出 16 字节的二进制如下:例如

0x5CFCD77F9FF836189D2F647EBCEA183E

我可以将其存储在以下数据类型中:

  • char(34)
  • binary(16)(我认为 - 我在这里读到(https://stackoverflow.com/questions/14722305/what-kind-of-datatype-should-one-use-to-store-hashes#16680423)使用相同的算法应该返回无论输入字符串如何,每次都使用相同的字节数)
  • 其他?

每一行都有一个值(没有空值),并且该列将用于与另一个表中的类似列进行比较。

HASHBYTES如上所述 ,存储输出以供使用的最佳数据类型是哪种?

我在想,由于固定长度的数据类型有时在连接等方面效率更高binary(16)。vs varbinary(8000)(的默认输出HASHBYTES)似乎最好,binary(16)vs avarchar(34)更好,因为它会使用更少的存储空间。

sql-server sql-server-2014
  • 1 个回答
  • 17575 Views
Martin Hope
GWR
Asked: 2017-11-26 18:35:14 +0800 CST

使用字符串时区信息转换 DATETIME 值?

  • 1

我有一列包含日期、时间和时区信息,如下所示:

Sat, 20 Aug 2016 03:50:04 CDT
Sun, 17 Sep 2017 16:51:46 CEST
Mon, 09 Oct 2017 06:43:27 CET
Thu, 28 Sep 2017 14:05:23 IST
Thu, 05 Oct 2017 08:59:01 IDT
Wed, 28 Jun 2017 17:10:22 CEST
Mon, 18 Sep 2017 18:32:52 GMT
Sat, 27 Aug 2016 07:06:22 MEST
Sat, 06 Aug 2016 13:17:09 UTC
Sat, 16 Jul 2016 23:53:02 PDT

我想将这些都标准化为 UTC。

我可以去掉前导的 5 个字符和尾随的时区字符串,它们转换为 datetime 就好了......但我的问题是:

SQL Server 是否有任何内置函数,我可以在其中传递日期时间、源时区字符串(例如)PDT和目标时区字符串(例如) UTC,它将处理转换?

我正在考虑类似于 Oracle 的东西:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'

我希望能够做到这一点,而不必维护时区偏移表来将字符串值映射到偏移量。我也不想在一些大的案例陈述中硬编码偏移量。

我在 sql server 2014 上,所以我不能将新select * from sys.time_zone_info的用于 2016 年的时区信息。

有什么想法吗?

sql-server sql-server-2012
  • 2 个回答
  • 5840 Views
Martin Hope
GWR
Asked: 2017-11-20 17:10:17 +0800 CST

在 SQL Server 中本机解码 Base64 字符串

  • 28

我varchar在 SQL Server 的表中有一个列,其中包含一个 base64 编码的文本字符串,我想将其解码为等效的纯文本

SQL Server 是否有任何本机功能来处理此类事情?

示例 base64 字符串:

cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA==

解码为:

role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764
sql-server sql-server-2008-r2
  • 1 个回答
  • 74451 Views
Martin Hope
GWR
Asked: 2017-11-16 09:39:02 +0800 CST

对有序集中具有空值的行子集进行分组

  • 3

假设我们有一个表,其中每一行都是一天,并且按这一天列排序。然后我们加入了一个成员数据集,显示成员在哪一天活跃(和不活跃)。

比方说我们当前的数据集看起来像这样……会员资格从第 3-5 天开始活跃,从第 5-8 天开始不活跃,从第 9 天开始活跃,等等。

DAY     DATE        MEMBER  ACTIVE
 1      2017-01-01  123     null
 2      2017-01-02  123     null
 3      2017-01-03  123     2017-01-03
 4      2017-01-04  123     2017-01-04
 5      2017-01-05  123     2017-01-05
 6      2017-01-06  123     null
 7      2017-01-07  123     null
 8      2017-01-08  123     null
 9      2017-01-09  123     2017-01-09
10      2017-01-10  123     2017-01-10

...所以ACTIVE=null意味着会员资格在那些日子里不活跃。

有了这个数据结构,我想得到一个“折叠”集,显示不活动/活动时间的“跨度”:

MEMBER  MIN(DATE)   MAX(DATE)   STATUS
123,    2017-01-01, 2017-01-02  INACTIVE
123,    2017-01-03, 2017-01-05  ACTIVE
123,    2017-01-06, 2017-01-08  INACTIVE
123,    2017-01-09, 2017-01-10  ACTIVE

我曾尝试使用 row_number() 以某种方式划分出特定状态的子集,但在这种情况下,在 ACTIVE 为空的行上使用min()/max()将它们视为一个组,而实际上,有几个不同的跨度“非活跃会员”。

为了分组目的,我如何区分非活跃成员的跨度?我可以使用什么技术来实现上面的输出?

这是生成虚拟源数据的脚本:

CREATE TABLE ##SRC (ID INT, D DATE, MEMBER INT, ACTIVE DATE);

INSERT INTO ##SRC (ID, D, MEMBER, ACTIVE)
SELECT 1, '2017-01-01', 123, NULL UNION 
SELECT 2, '2017-01-02', 123, NULL UNION 
SELECT 3, '2017-01-03', 123, '2017-01-03' UNION 
SELECT 4, '2017-01-04', 123, '2017-01-04' UNION 
SELECT 5, '2017-01-05', 123, '2017-01-05' UNION 
SELECT 6, '2017-01-06', 123, NULL UNION 
SELECT 7, '2017-01-07', 123, NULL UNION 
SELECT 8, '2017-01-08', 123, NULL UNION 
SELECT 9, '2017-01-09', 123, '2017-01-09' UNION 
SELECT 10, '2017-01-10',    123, '2017-01-10' 
;
sql-server sql-server-2008-r2
  • 2 个回答
  • 147 Views
Martin Hope
GWR
Asked: 2017-10-13 10:50:21 +0800 CST

SQL Server 调试器权限,但未将系统管理员授予开发人员

  • 6

BOL 文档说运行调试器需要系统管理员权限。

我 90% 确定这个要求没有解决方法,但我想我会问一下,以防有人找到一种方法来授予 Debugger 权限而不授予 sysadmin 权限。

当你有一个开发团队需要通过变量等复杂的游标循环来调试其中的某些方面时,人们会怎么做?

大多数商店甚至不允许开发人员在开发服务器上拥有系统管理员权限,并且由于 PII 和数据安全原因,许多商店不允许开发人员使用他们自己的开发人员 sql 服务器版本在本地计算机上保留企业数据的副本。

不知道为什么会以这种方式设置调试器。

所以,我很好奇其他人在类似情况下如何处理对调试器权限的请求。

你在你的环境中做什么?

sql-server sql-server-2014
  • 4 个回答
  • 9771 Views
Martin Hope
GWR
Asked: 2017-06-08 04:39:33 +0800 CST

获取上周某天的日期

  • 4

在学习如何从前一周获取一周中某一天的日期(例如从前一周的星期一的日期)时,我发现以下两个表达式通常出现,您可以更改最后一个数字(例如 0=星期一)取决于你想要哪一天:

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)

SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)

当我今天运行它时,两者似乎都返回了正确的日期2017-05-29(2017-06-17)。

我的问题是 - 这是如何工作的?似乎是在数周后6还是7数周后1900-01-01?为什么它同时适用于 a6和7?

此外,是否存在需要注意可能无法提供预期结果的边缘情况?

sql-server t-sql
  • 1 个回答
  • 3789 Views
Martin Hope
GWR
Asked: 2016-12-09 03:59:31 +0800 CST

索引用于 BitWise 查询的 INT 列的最佳方法

  • 6

基于 WHERE 子句中的按位比较,索引列以进行有效查找的最佳方法是什么,例如

SELECT ID, FLAGS, NAME FROM TABLE WHERE FLAGS & 4 = 4

我在 SQL Server 2012 环境中。

我知道在这种类型的查询中不会使用 FLAGS 列上的索引。

我知道另一种选择是将 FLAGS 列分成单独的列,但我想避免这种情况,因为在某些情况下,这意味着 25+ 个新列,每个列都需要索引组合来支持常见查询。

有什么方法可以索引单个列,以便按位查询更有效?

我尝试使用下面 dudu 建议的带有索引的计算列,但是当我在具有聚集索引的表上使用时,并开始选择列(而不仅仅是 select count(*) 它不再使用该索引新的计算列。

SELECT 
* 
INTO 
    MYTABLE
FROM 
(
    SELECT 'A' COL_A, 'A' COL_B, CAST(129 AS INT) FLAGS UNION
    SELECT 'B' COL_A, 'D' COL_B, CAST(129 AS INT) FLAGS UNION
    SELECT 'C' COL_A, 'S' COL_B, CAST(129 AS INT) FLAGS UNION
    SELECT 'D' COL_A, 'F' COL_B, CAST(129 AS INT) FLAGS UNION
    SELECT 'E' COL_A, 'T' COL_B, CAST(128 AS INT) FLAGS UNION
    SELECT 'F' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
    SELECT 'G' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
    SELECT 'H' COL_A, 'X' COL_B, CAST(128 AS INT) FLAGS 
) SRC

CREATE CLUSTERED INDEX IX_CLU_A ON MYTABLE(COL_A)



ALTER TABLE MYTABLE ADD FLAG_BIT_1 AS (CAST ((FLAGS & 1) AS BIT))
CREATE INDEX MYTABLE_IX_FLAG_BIT_1 ON MYTABLE (FLAG_BIT_1)

SELECT * FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT * FROM MYTABLE WHERE FLAG_BIT_1 = 1

SELECT COUNT(*) FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT COUNT(*) FROM MYTABLE WHERE FLAG_BIT_1 = 1
sql-server sql-server-2012
  • 1 个回答
  • 1772 Views
Martin Hope
GWR
Asked: 2016-11-29 06:13:58 +0800 CST

带有模式匹配的 WHERE 子句可查找包含不在列表中的任何字符的行

  • 4

我在 SQL Server 2008 环境中。

我试图在WHERE子句中使用模式匹配来查找某个列的值包含非字母数字、下划线、破折号、句点或空格的字符的行。

这是我的代码和示例数据,但我没有得到预期的结果。

在示例数据中,我想返回第 7、8、9 和 12 行,但我得到的是第 5 行和第 6 行。

如果这不是实现目标的最佳方式,我愿意听取其他方法。

我不在一个可以实现正则表达式的环境中,所以我的解决方案仅限于开箱即用的功能。

CREATE TABLE PATTERN_TEST
(
ID INT NOT NULL,
STRING NVARCHAR(40) NOT NULL
)

INSERT INTO PATTERN_TEST
SELECT 1, 'string' UNION 
SELECT 2, 'STRING' UNION 
SELECT 3, 'string space' UNION 
SELECT 4, 'STRING SPACE' UNION 
SELECT 5, 'string-dash' UNION 
SELECT 6, 'string-dash space' UNION 
SELECT 7, 'string "otherchar"' UNION 
SELECT 8, 'string "other char"' UNION 
SELECT 9, '"string"' UNION 
SELECT 10, 'string_underscore' UNION 
SELECT 11, 'string_underscore space' UNION
SELECT 12, '"'
;

SELECT * FROM PATTERN_TEST WHERE STRING LIKE '%[^a-zA-Z0-9_ -.]%';
sql-server sql-server-2008
  • 2 个回答
  • 7639 Views
Martin Hope
GWR
Asked: 2016-09-01 07:10:41 +0800 CST

在 SQL Server 中将 rfc822 转换为 GMT DATETIME 或 Unix 时间戳

  • 1

我试图找到一种方法将 rfc822 字符串日期(带时区)转换为数据类型 DATETIME 的 GMT 值或数据类型 INT 的 unix 时间戳。例如:

Mon, 15 Aug 2016 11:36:36 UTC
Mon, 29 Aug 2016 04:37:10 GMT
Wed, 27 Jul 2016 14:41:05 UTC

我相信“UTC”和“GMT”部分实际上意味着同一件事,对于我的特定用例,我相信这是我将看到的仅有的两个时区值。

我在 SQL Server 2008r2 环境中工作。

我发现唯一能做到这一点的是下面的功能,但我想避免这样做有几个原因:

  • 它使用硬编码偏移量
  • 它需要注册表读取访问权限(我认为我的托管服务提供商不会拥有​​)
  • 我希望不要依赖于用户定义的函数

有没有更简单的方法来完成这种转换?更好的是我可以在 T-SQL 中本地使用而不是创建函数依赖项。

CREATE FUNCTION udf_ConvertTime (
    @TimeToConvert  varchar(80),
    @TimeZoneTo     varchar(8)
)
RETURNS DateTime
AS
BEGIN
    DECLARE @dtOutput       datetime,
            @nAdjust        smallint,
            @hh             smallint,
            @Loc            smallint,
            @FromDate       datetime,
            @mm             smallint,
            @Ndx            tinyint,
            @TimeZoneFrom   varchar(80),
            @WkTime         varchar(80)

    SET @TimeZoneTo = ISNULL(@TimeZoneTo, 'LOCAL')

    /* ------------------------------------------------------------------------ */
    /*  Important: If you want to convert to your local time, the following is  */
    /*  necessary to handle daylight savings time. Your SQLServer installation  */
    /*  must allow this function to execute xp_regread.                         */
    /* ------------------------------------------------------------------------ */

    SET @Loc = CONVERT(smallint, DATEDIFF(hh, GETUTCDATE(), GETDATE()) * 60)
    IF @TimeZoneTo = 'LOCAL'
    BEGIN
        DECLARE @root VARCHAR(32),
                @key  VARCHAR(128),
                @StandardBias VARBINARY(8),
                @DaylightBias VARBINARY(8)
        SET @root = 'HKEY_LOCAL_MACHINE'
        SET @key  = 'SYSTEM\CurrentControlSet\Control\TimeZoneInformation'
        EXEC master..xp_regread @root, @key, 'StandardBias', @StandardBias OUTPUT
        EXEC master..xp_regread @root, @key, 'DaylightBias', @DaylightBias OUTPUT
        IF @StandardBias <> @DayLightBias
            SET @Loc = @Loc - 60
    END

    /* ------------------------------------------------------------------------ */
    /*  Build a temporary table of timezone conversions.                        */
    /* ------------------------------------------------------------------------ */

    DECLARE @Temp TABLE (
        TimeZone varchar(8),
        nOffset  smallint )

    INSERT INTO @Temp
    SELECT 'A',     60  UNION ALL
    SELECT 'ACDT', 630  UNION ALL
    SELECT 'ACST', 570  UNION ALL
    SELECT 'ADT', -180  UNION ALL
    SELECT 'AEDT', 660  UNION ALL
    SELECT 'AEST', 600  UNION ALL
    SELECT 'AKDT',-480  UNION ALL
    SELECT 'AKST',-540  UNION ALL
    SELECT 'AST', -240  UNION ALL
    SELECT 'AWDT', 540  UNION ALL
    SELECT 'AWST', 480  UNION ALL
    SELECT 'B',    120  UNION ALL
    SELECT 'BST',   60  UNION ALL
    SELECT 'C',    180  UNION ALL
    SELECT 'CDT', -300  UNION ALL
    SELECT 'CEDT', 120  UNION ALL
    SELECT 'CEST', 120  UNION ALL
    SELECT 'CET',   60  UNION ALL
    SELECT 'CST', -360  UNION ALL
    SELECT 'CXT',  420  UNION ALL
    SELECT 'D',    240  UNION ALL
    SELECT 'E',    300  UNION ALL
    SELECT 'EDT', -240  UNION ALL
    SELECT 'EEDT', 180  UNION ALL
    SELECT 'EEST', 180  UNION ALL
    SELECT 'EET',  120  UNION ALL
    SELECT 'EST', -300  UNION ALL
    SELECT 'F',    360  UNION ALL
    SELECT 'G',    420  UNION ALL
    SELECT 'GMT',    0  UNION ALL
    SELECT 'H',    480  UNION ALL
    SELECT 'HAA', -180  UNION ALL
    SELECT 'HAC', -300  UNION ALL
    SELECT 'HADT',-540  UNION ALL
    SELECT 'HAE', -240  UNION ALL
    SELECT 'HAP', -420  UNION ALL
    SELECT 'HAR', -360  UNION ALL
    SELECT 'HAST',-600  UNION ALL
    SELECT 'HAT', -150  UNION ALL
    SELECT 'HAY', -480  UNION ALL
    SELECT 'HNA', -240  UNION ALL
    SELECT 'HNC', -360  UNION ALL
    SELECT 'HNE', -300  UNION ALL
    SELECT 'HNP', -480  UNION ALL
    SELECT 'HNR', -420  UNION ALL
    SELECT 'HNT', -210  UNION ALL
    SELECT 'HNY', -540  UNION ALL
    SELECT 'I',    540  UNION ALL
    SELECT 'IST',   60  UNION ALL
    SELECT 'K',    600  UNION ALL
    SELECT 'L',    660  UNION ALL
    SELECT 'LOC',  @Loc UNION ALL
    SELECT 'LOCAL',@Loc UNION ALL
    SELECT 'M',    720  UNION ALL
    SELECT 'MDT', -360  UNION ALL
    SELECT 'MESZ', 120  UNION ALL
    SELECT 'MEZ',   60  UNION ALL
    SELECT 'MST', -420  UNION ALL
    SELECT 'N',    -60  UNION ALL
    SELECT 'NDT', -150  UNION ALL
    SELECT 'NFT',  690  UNION ALL
    SELECT 'NST', -210  UNION ALL
    SELECT 'O',   -120  UNION ALL
    SELECT 'P',   -180  UNION ALL
    SELECT 'PDT', -420  UNION ALL
    SELECT 'PST', -480  UNION ALL
    SELECT 'Q',   -240  UNION ALL
    SELECT 'R',   -300  UNION ALL
    SELECT 'S',   -360  UNION ALL
    SELECT 'T',   -420  UNION ALL
    SELECT 'U',   -480  UNION ALL
    SELECT 'UTC',    0  UNION ALL
    SELECT 'V',   -540  UNION ALL
    SELECT 'W',   -600  UNION ALL
    SELECT 'WEDT',  60  UNION ALL
    SELECT 'WEST',  60  UNION ALL
    SELECT 'WET',    0  UNION ALL
    SELECT 'WST',  540  UNION ALL
    SELECT 'WST',  480  UNION ALL
    SELECT 'X',   -660  UNION ALL
    SELECT 'Y',   -720  UNION ALL
    SELECT 'Z',      0

    /* ------------------------------------------------------------------------ */
    /*  If timezone is embedded within @TimeToConvert, separate it out. If we   */
    /*  can at all convert this date with SQL, do it.                           */
    /* ------------------------------------------------------------------------ */

    SET @Ndx = CHARINDEX(' ', REVERSE(@TimeToConvert))
    IF @Ndx > 0
    BEGIN
        SET @TimeZoneFrom = RIGHT(@TimeToConvert, @Ndx - 1)

        IF 'TRUE' = CASE
                        WHEN @TimeZoneFrom LIKE '[0-9][0-9][0-9][0-9]' THEN 'TRUE'
                        WHEN @TimeZoneFrom LIKE '[+][0-9][0-9][0-9][0-9]' THEN 'TRUE'
                        WHEN @TimeZoneFrom LIKE '[-][0-9][0-9][0-9][0-9]' THEN 'TRUE'
                        ELSE 'FALSE'
                    END
        BEGIN   -- This has already converted offset hhmm
            SET @hh = CONVERT(smallint, LEFT(@TimeZoneFrom, LEN(@TimeZoneFrom) - 2))
            SET @mm = CONVERT(smallint, RIGHT(@TimeZoneFrom, 2))
            SET @nAdjust = (@hh * 60) + @mm
            SET @TimeToConvert = LEFT(@TimeToConvert, LEN(@TimeToConvert) - @Ndx)
        END
        ELSE
        IF EXISTS (SELECT 1 FROM @Temp
                   WHERE  TimeZone = @TimeZoneFrom)
            SET @TimeToConvert = LEFT(@TimeToConvert, LEN(@TimeToConvert) - @Ndx)
        ELSE
            SET @TimeZoneFrom = NULL
    END

    IF ISDATE(@TimeToConvert) = 1
        SET @FromDate = CONVERT(datetime, @TimeToConvert)

    SET @TimeZoneFrom = ISNULL(@TimeZoneFrom, 'LOCAL')

    /* ------------------------------------------------------------------------ */
    /*  We are providing a varchar(80) date field to facilitate RFC822 dates.   */
    /* ------------------------------------------------------------------------ */

    IF @FromDate IS NULL
    BEGIN
        SET @Ndx  = 1

        SET @WkTime = REPLACE(@TimeToConvert, ',', '')
        SET @WkTime = REVERSE(
                        SUBSTRING(
                            REVERSE(
                                SUBSTRING(@WkTime, 5, LEN(@WkTime))
                                   ), @Ndx, LEN(@WkTime)))

        IF CHARINDEX(' ', @WkTime)     = 4  AND
           CHARINDEX(' ', @WkTime, 5)  = 7  AND
           CHARINDEX(':', @WkTime, 8)  = 10 AND
           CHARINDEX(':', @WkTime, 11) = 13 -- Means we have no year
            SET @WkTime = LEFT(@WkTime, 7) + CONVERT(varchar(5), YEAR(GETDATE())) + SUBSTRING(@WkTime, 7, 40)

        IF ISDATE(@WkTime) = 1
            SET @FromDate = CONVERT(datetime, @WkTime)
    END

    IF @FromDate IS NULL
        RETURN @FromDate

    /* ------------------------------------------------------------------------ */
    /*  If the from and to are the same, we need go no further.                 */
    /* ------------------------------------------------------------------------ */

    IF ISNULL(@TimeZoneFrom, '') IN (ISNULL(@TimeZoneTo, ''), ISNULL(@TimeZoneTo, 'LOCAL'))
        RETURN @FromDate

    /* ------------------------------------------------------------------------ */
    /*  Return the difference between the from/to timezones.                    */
    /* ------------------------------------------------------------------------ */

    IF @nAdjust IS NULL
    BEGIN
        SELECT @nAdjust = nOffset
        FROM   @Temp
        WHERE  timeZone = @TimeZoneFrom

        IF EXISTS (SELECT 1 FROM @Temp
                   WHERE  timeZone = @TimeZoneTo)
            SELECT @nAdjust = nOffset - @nAdjust
            FROM   @Temp
            WHERE  timeZone = @TimeZoneTo
    END

    SET @dtOutput = DATEADD(n, ISNULL(@nAdjust, 0), @FromDate)
    RETURN @dtOutput
END
sql-server sql-server-2008-r2
  • 1 个回答
  • 597 Views
Martin Hope
GWR
Asked: 2016-05-18 12:42:38 +0800 CST

奇怪的 WHERE 子句行为。为什么这会返回一行?

  • 5

在 SQL Server 2008 中,为什么这会返回该行,即使我在 where 子句的末尾添加了一个或两个或更多空格?在以下示例中不应该找到零记录吗?

WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345  '

如果需要查询查找'1234 '但没有怎么办'1234'

sql-server
  • 4 个回答
  • 316 Views
Martin Hope
GWR
Asked: 2016-05-05 10:29:04 +0800 CST

串联,带分隔符,其中输入字段的任何组合都可能为空

  • 5

我有三列,CITY, STATE, COUNTRY。一列、两列或所有列都可以为 NULL。

使用以下逻辑,使用下面的 SQL 生成单个字符串。乱七八糟,不知有没有更简单的方法实现输出?我已经考虑过 CONCAT() 但我不认为我可以使用它并且仍然在那里得到分隔符。

  • 如果 CITY 和 STATE 都有值,则使用该值,以 . 分隔', '。排除国家/地区。
  • 如果仅存在 CITY 或 STATE 之一,并且存在 Country,则使用存在的 CITY/STATE 之一,加上分隔符和 COUNTRY。
  • 如果 CITY 或 STATE 都不存在,则仅使用不带分隔符的国家/地区
  • 如果三者中只有一个存在,则按原样使用它,不带分隔符
  • 如果不存在,则输出应为 NULL(不是'')

我将补充一点,如果存在 CITY 和/或 STATE 值,则 COUNTRY 永远不会为 NULL。

这是到目前为止的代码。它很乱,但我相信它符合上面列出的输出要求。

我正在使用 SQL Server 2008。

CASE WHEN 
    CASE WHEN ISNULL(M.CITY, '') = '' THEN  '' ELSE ISNULL(M.CITY, '') + ', ' END + CASE WHEN ISNULL(M.PROVINCE, '') = '' THEN  '' ELSE ISNULL(M.PROVINCE, '') END

     = '' THEN CASE WHEN COUNTRY IS NOT NULL THEN COUNTRY ELSE NULL END ELSE 

     CASE WHEN ISNULL(M.CITY, '') = '' THEN  '' ELSE ISNULL(M.CITY, '') + ', ' END + CASE WHEN ISNULL(M.PROVINCE, '') = '' THEN  '' ELSE ISNULL(M.PROVINCE, '') END 
END 
+ 
CASE
    WHEN (M.CITY IS NULL AND M.PROVINCE IS NOT NULL) OR (M.CITY IS NOT NULL AND M.PROVINCE IS NULL) THEN 
        CASE WHEN PROVINCE IS NOT NULL AND CITY IS NULL THEN ', ' ELSE '' END + COUNTRY
    ELSE '' 
END 
LOCATION 
sql-server
  • 1 个回答
  • 1027 Views
Martin Hope
GWR
Asked: 2016-05-03 04:12:13 +0800 CST

修剪尾随空格、制表符、换行符、回车符等

  • 4

我正在使用 SQL Server 2008,我正在寻找一个类似的函数ltrim,rtrim它还将删除前导和尾随制表符、双空格、回车、换行等。

那里有许多函数,但我发现的函数都有限制,例如将字符串截断为 8000 个字符。例如(根据一些评论):

SQL SERVER – 2008 – 增强的 TRIM() 函数 – 删除尾随空格、前导空格、空格、制表符、回车、换行

其中一条评论提出了一个更好的解决方案,但- 1导致incorrect syntax错误,我不知道为什么。

CREATE FUNCTION dbo.SuperTrimLeft(@str varchar(MAX)) RETURNS varchar(MAX)
    AS
    BEGIN
    IF (ASCII(LEFT(@str, 1)) < 33) BEGIN
        SET @str = STUFF(@str, 1, PATINDEX('%[^'+CHAR(0)+'-'+CHAR(32)+']%', @str) – 1, ' ');
    END;

    RETURN @str;
END;

所以我的问题是,完成上述任务的最佳方法是什么?

sql-server functions
  • 4 个回答
  • 10350 Views
Martin Hope
GWR
Asked: 2016-04-29 12:25:03 +0800 CST

在多行字符串的行首搜索 X

  • 2

在 SQL Server (2008) 上,我有一列是 varchar(max)。

我想查询 blurb 包含字母列表的所有行:

Some sentence is here

a. foo
b. bar
c. baz

Some more text later

可以在正则表达式中轻松执行此操作,但我无权向我的实例添加正则表达式功能。

那么,如何使用 LIKE 进行搜索以找到类似的内容?大概我需要找到该行的第一个字符(在多行简介中)是一个字符,第二个是一个点。

sql-server
  • 1 个回答
  • 134 Views
Martin Hope
GWR
Asked: 2013-09-27 04:27:00 +0800 CST

优化 UDF - 使用 DUAL 很昂贵

  • 1

我是 Oracle 技术的新手(主要精通 SQL Server)并且我在 UDF 的性能方面遇到了麻烦。

UDF 的目的是为“事件”获取一些输入,并查找“事件 b 发生的预期时间”。该函数返回单个DATE值。

首先发生的是SELECT ... INTO [variable] FROM DUAL;一个变量。最后在引用表(仅约 30k 行)中进行查找,并将其存储在返回变量中。

处理 80 万行需要 8 个小时。我可以在不到 40 秒的时间内选择所有列,而无需使用该功能。

我的主要问题是:使用 DUAL 会让我付出代价吗?

我们在 Oracle 11g RAC 上。

oracle tuning
  • 2 个回答
  • 133 Views
Martin Hope
GWR
Asked: 2013-07-12 05:25:53 +0800 CST

SQLCMD 导出 1650 万行

  • 4

我正在使用 sqlcmd 将表导出到 TSV 文件,但遇到了问题。该表有 16+ 百万行和大约 55 列。

问题是它没有导出完整的表,但似乎在各个点随机停止(我猜是超时?)每次导出不同数量的行并且每次文件的大小略有不同(表明我没有达到任何行或大小限制)。

我没有使用任何超时开关(意味着使用“只要它需要”的默认值)。

这是我的命令(为了简化和说明目的,删除了大多数列):

sqlcmd -U myUsername -P myPassword -S SERVERNAME -d "DBNAME" -Q "SELECT ROW_KEY, ISNULL(CARRIER_ID, ''),ISNULL(CONVERT(VARCHAR(19),ORDER_DATETIME,120),''),ISNULL(HEIGHT, ''),ISNULL(RESIDENTIAL_CHARGE, '') FROM MYTABLE" -o "OUTPUT_FILE.txt" -h-1 -s"|" -W

我想知道它是否与超时或在所有列上使用 ISNULL() 有关(尽管当我在 sql server management studio 中运行查询时,我得到了正确的返回行数,例如 1600 万 + )?

同样,我每次得到大约 4-8 百万行,但从来没有全部。我在 sql server 2k5 db 中,并从带有 sql server 2k8 的远程计算机运行 sqlcmd。

sql-server sqlcmd
  • 3 个回答
  • 3988 Views
Martin Hope
GWR
Asked: 2013-05-04 10:30:44 +0800 CST

将 3000 万行导出到 CSV

  • 5

我有一个查询命中 Oracle 数据库 (11g) 中的多个表。我无权访问服务器本身。我使用 SQL Developer 或 SQL*Plus 进行连接。

大约有 3100 万行和 7 列,我想将其转储到 CSV 文件中。

我怎样才能做到这一点?

oracle oracle-sql-developer
  • 2 个回答
  • 75211 Views
Martin Hope
GWR
Asked: 2013-04-06 09:53:58 +0800 CST

Oracle 替代 EXISTS EXCEPT

  • 1

我想知道对于这里发布和回答的问题,Oracle 是否有同样优雅的解决方案:

比较可以包含 NULLS 的列 - 有没有更优雅的方法?

我无法让这个解决方案(被接受的那个)在 Oracle 环境中工作。

oracle minus
  • 1 个回答
  • 1868 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