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

Andriy M's questions

Martin Hope
Andriy M
Asked: 2024-02-09 12:59:04 +0800 CST

当贡献列已经是唯一的时,计算列上的唯一索引

  • 9

我有一个这样的表:

CREATE TABLE
  dbo.DiscountBarcodeList
(

  ID int NOT NULL IDENTITY
    CONSTRAINT PK_DiscountBarcodeList
    PRIMARY KEY CLUSTERED

, Discount int NOT NULL
    CONSTRAINT FK_DiscountBarcodeList_Discount
    FOREIGN KEY REFERENCES dbo.Discount (ID)

, CodeNumber int NOT NULL

, AssignedEntity int NULL
    CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
    FOREIGN KEY REFERENCES dbo.Entity (ID)
    ON DELETE SET NULL

, BarcodeID AS
    CONVERT(
      char(10)
    , CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
    , 2)

, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
    UNIQUE NONCLUSTERED 
    (
      Discount  ASC
    , CodeNumber ASC
    )

);

该表将保存预先CodeNumber分配给 s 的 s并根据需要分配给 s。虽然不是在数据库级别,但和的值将分别限制为 2 字节和 3 字节。这些限制与 的唯一约束一起,将有效地使生成的值也唯一。DiscountEntityDiscountCodeNumber(Discount, CodeNumber)BarcodeID

该表的使用方式是,应用程序将传递 a@BarcodeID来查找 an@Entity以分配给它。如果查找成功,则该行将Entity被设置为@Entity,或者应用程序将收到通知,该行@BarcodeID已被采用,大致如下:

BEGIN TRANSACTION;

UPDATE
SET
  @OldEntity = Entity
, Entity = @Entity
WHERE
  BarcodeID = @BarcodeID
;

IF @OldEntity IS NULL
BEGIN
  COMMIT TRANSACTION;
  ...  /* report success */
END

ELSE
BEGIN
  ROLLBACK TRANSACTION;
  ...  /* report failure */
END;

现在我想做BarcodeIDsargable。因为我知道该列只有唯一值,所以我正在考虑使索引唯一,因为我认为这可以使我的查找更有效。另一方面,我担心必须检查生成的值的唯一性,这在这里是多余的,因为唯一性已经得到保证。

是否有可能以某种方式判断计算列上唯一索引的好处(如果有的话)是否会超过(在这种情况下不必要的)唯一性检查的可能开销?或者至少对于像我这样的场景可以确定这一点吗?或者我只是想太多了?

sql-server
  • 1 个回答
  • 188 Views
Martin Hope
Andriy M
Asked: 2019-12-05 03:06:25 +0800 CST

将多行插入只有一个 IDENTITY 列的表中[重复]

  • 7
这个问题在这里已经有了答案:
如何插入默认行? (1 个回答)
2年前关闭。

我有一个dbo.Groups这样定义的表:

CREATE TABLE dbo.Groups
(
  GroupID int NOT NULL IDENTITY (1,1) PRIMARY KEY
);

该表实际上只包含一IDENTITY列。

有时我想一次插入多行并获取生成的 ID。(我已经有一个预定义的表变量,在子句中使用@output单个ID列调用。)OUTPUT

现在我知道如果它是单行我将如何进行:

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
DEFAULT VALUES
;

但我希望能够一次插入两个或更多。实际数量取决于此查询返回的行数:

SELECT
  *
FROM
  dbo.MySource
;

因此,如果查询返回一行,我想插入一行dbo.Groups并返回生成的GroupID. 如果它是一百行,那么我预计会插入一百行,并立即生成和返回一百个 ID。

一种明显的方法是在循环中一次插入一行。我想避免这种情况,而是使用基于集合的方法,类似于

INSERT INTO
  dbo.GroupID
OUTPUT
  inserted.GroupID INTO @output (ID)
SELECT
  ...  -- what?
FROM
  dbo.MySource
;

有没有办法将多行插入到一个表中,而表中只有一个IDENTITY列(最好是)一个语句?

sql-server sql-server-2008
  • 1 个回答
  • 2032 Views
Martin Hope
Andriy M
Asked: 2019-10-19 06:41:11 +0800 CST

运行多批处理脚本的 SQLCMD 中的会话 ID

  • 2

我的脚本包含多个GO关键字。我知道 SQLCMD 解释GO为批处理分隔符,因此代码不是作为单个块运行,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?

我尝试使用这样的简单脚本对此进行测试:

SELECT @@SPID
GO

SELECT @@SPID
GO

SELECT @@SPID
GO

然后我使用这个命令从命令行运行脚本

SQLCMD -S MyServer\Instance -E -i MyScript.sql

并得到这个输出:


------
    62

(1 rows affected)

------
    62

(1 rows affected)

------
    62

(1 rows affected)

它似乎肯定地回答了我的问题,但随后我再次运行脚本并得到完全相同的输出,即所有值都62再次出现。显然 SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID单次运行返回相同的值可能并不一定意味着它是同一个会话。每个批次都可以在恰好接收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。

因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多批相同的脚本?有没有办法确定这一点?

sql-server sqlcmd
  • 1 个回答
  • 196 Views
Martin Hope
Andriy M
Asked: 2019-05-07 03:04:28 +0800 CST

使用 XPath/XQuery 连接同一 XML 元素的所有值

  • 14

我有一个这样的 XML 值:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
</R>

我想连接所有I值并将它们作为单个字符串返回:ABC....

现在我知道我可以分解 XML,将结果聚合为无节点 XML,然后应用于.values('text()[1]', ...)结果:

SELECT
  (
    SELECT
      n.n.value('text()[1]', 'varchar(50)') AS [text()]
    FROM
      @MyXml.nodes('/R/I') AS n (n)
    FOR XML
      PATH (''),
      TYPE
  ).value('text()[1]', 'varchar(50)')
;

但是,我只想使用 XPath/XQuery 方法来完成所有这些工作,如下所示:

SELECT @MyXml. ? ( ? );

有没有这样的方法?

我在这个方向寻找解决方案的原因是因为我的实际 XML 也包含其他元素,例如:

<R>
  <I>A</I>
  <I>B</I>
  <I>C</I>
  ...
  <J>X</J>
  <J>Y</J>
  <J>Z</J>
  ...
</R>

而且我希望能够将I值提取为单个字符串并将J值提取为单个字符串,而不必为每个值使用笨拙的脚本。

sql-server sql-server-2014
  • 3 个回答
  • 4909 Views
Martin Hope
Andriy M
Asked: 2018-05-12 04:34:27 +0800 CST

使用“[ ]”通配符将 ](右方括号)与 PATINDEX 匹配

  • 9

我正在用 T-SQL †编写自定义 JSON 解析器。

出于解析器的目的,我正在使用PATINDEX从标记列表中计算标记位置的函数。在我的例子中,标记都是单个字符,它们包括:

{ } [ ] : ,

通常,当我需要找到几个给定字符中的任何一个的(第一个)位置时,我会使用如下PATINDEX函数:

PATINDEX('%[abc]%', SourceString)

然后,该函数将为我提供aorb或的第一个位置c——以最先找到的为准——在SourceString.

现在我的问题似乎与]角色有关。一旦我在字符列表中指定它,例如这样:

PATINDEX('%[[]{}:,]%', SourceString)

我的预期模式显然被破坏了,因为该函数永远找不到匹配项。看起来我需要一种方法来逃避第一个],以便PATINDEX将其视为查找字符之一而不是特殊符号。

我发现这个问题询问了类似的问题:

  • 需要 LIKE 运算符和方括号方面的帮助

但是,在这种情况下,]不需要在括号中指定,因为它只是一个字符,并且可以在没有括号的情况下指定。确实使用转义的替代解决方案仅适用于LIKE而不适用于PATINDEX,因为它使用ESCAPE由前者支持而不是后者支持的子条款。

所以,我的问题是,有没有办法使用通配符来寻找 a ?]PATINDEX[ ]或者有没有办法使用其他 Transact-SQL 工具来模拟该功能?

附加信息

PATINDEX这是我需要与上述[…]模式一起使用的查询示例。这里的模式有效(尽管有点),因为它不包括]字符。我也需要它来工作]:

WITH
  data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON),
  parser AS
  (
    SELECT
      Level         = 1,
      OpenClose     = 1,
      P             = p.P,
      S             = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) - 1),
      C             = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0), 1),
      ResponseJSON  = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0) + 1, 999999)
    FROM
      data AS d
      CROSS APPLY (SELECT PATINDEX('%[[{]%', d.ResponseJSON)) AS p (P)
    UNION ALL
    SELECT
      Level         = ISNULL(d.OpenClose - 1, 0) + d.Level + ISNULL(oc.OpenClose, 0),
      OpenClose     = oc.OpenClose,
      P             = d.P + p.P,
      S             = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) - 1),
      C             = c.C,
      ResponseJSON  = SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0) + 1, 999999)
    FROM
      parser AS d
      CROSS APPLY (SELECT PATINDEX('%[[{}:,]%' COLLATE Latin1_General_BIN2, d.ResponseJSON)) AS p (P)
      CROSS APPLY (SELECT SUBSTRING(d.ResponseJSON, NULLIF(p.P, 0), 1)) AS c (C)
      CROSS APPLY (SELECT CASE WHEN c.C IN ('[', '{') THEN 1 WHEN c.C IN (']', '}') THEN 0 END) AS oc (OpenClose)
    WHERE 1=1
      AND p.P <> 0
  )
SELECT
  *
FROM
  parser
OPTION
  (MAXRECURSION 0)
;

我得到的输出是:

Level  OpenClose  P   S      C   ResponseJSON
-----  ---------  --  -----  --  ---------------------------
1      1          1          {   "f1":["v1","v2"],"f2":"v3"}
1      null       6   "f1"   :   ["v1","v2"],"f2":"v3"}
2      1          7          [   "v1","v2"],"f2":"v3"}
2      null       12  "v1"   ,   "v2"],"f2":"v3"}
2      null       18  "v2"]  ,   "f2":"v3"}
2      null       23  "f2"   :   "v3"}
2      0          28  "v3"   }   

您可以看到]被包含S在其中一行中。该Level列表示嵌套的级别,表示括号和大括号的嵌套。如您所见,一旦级别变为2,它就永远不会回到1。如果我可以将其PATINDEX识别]为令牌,它将具有。

上述示例的预期输出为:

Level  OpenClose  P   S     C   ResponseJSON
-----  ---------  --  ----  --  ---------------------------
1      1          1         {   "f1":["v1","v2"],"f2":"v3"}
1      NULL       6   "f1"  :   ["v1","v2"],"f2":"v3"}
2      1          7         [   "v1","v2"],"f2":"v3"}
2      NULL       12  "v1"  ,   "v2"],"f2":"v3"}
2      0          17  "v2"  ]   ,"f2":"v3"}
1      NULL       18        ,   "f2":"v3"}
1      NULL       23  "f2"  :   "v3"}
1      0          28  "v3"  }

您可以在 db<>fiddle使用此查询。


†我们使用的是 SQL Server 2014,不太可能很快升级到原生支持 JSON 解析的版本。我可以编写一个应用程序来完成这项工作,但是解析的结果需要进一步处理,这意味着应用程序中的工作不仅仅是解析——这种工作会更容易,而且可能更有效,完成一个 T-SQL 脚本,如果我能将它直接应用到结果中就好了。

我不太可能使用 SQLCLR 作为这个问题的解决方案。但是,我不介意有人决定发布 SQLCLR 解决方案,因为这可能对其他人有用。

sql-server t-sql
  • 5 个回答
  • 5508 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