小编And*_*y M的帖子

优化收集所有相关项目的查询

下表是我的菜单主​​表,菜单深度不受限制。每个菜单可以有一个子菜单和一个子子菜单等等。

我面临的问题是获取具有相同顶级父级的所有项目。

一种解决方案是在父级不为空时进行循环,第二种解决方案是创建一个具有父级 id 的视图以及所有带有逗号分隔列的子菜单 id。

然后一个选择命令将给出父 ID。我的表如下:

CategoryID  | ParentID    
1           | null        
2           | null        
3           | 1           
4           | 1           
5           | 2           
6           | 2           
7           | 3           
Run Code Online (Sandbox Code Playgroud)

输出应该是

CategoryID  | AllRelatedCategory
1           | 1,3,4,7
2           | 2,5,6
Run Code Online (Sandbox Code Playgroud)

我当前的代码如下。问题是它仅适用于 3 个层次结构。

;with cte as
(
select a.CategoryID col1, convert(varchar, a.CategoryID) col2, a.ParentID
from [dbo].[TB_CATEGORY_MASTER] a where a.ParentID is null

union
select a.CategoryID col1, (convert(varchar, isnull(b.CategoryID,''))) col2, a.ParentID
from [dbo].[TB_CATEGORY_MASTER] a 
left join [dbo].[TB_CATEGORY_MASTER] b on a.CategoryID=b.ParentID …
Run Code Online (Sandbox Code Playgroud)

sql-server

5
推荐指数
1
解决办法
209
查看次数

根据开始和结束时间每小时拆分持续时间

我有一个表,用于注册设备的状态。状态有开始时间和结束时间。但现在我想知道每个小时的状态是什么。如果从 15:20 到 17:10 的状态是“Operating”,我想看到它在一天的第 16 个小时运行 40 分钟,第 17 个小时运行 60 分钟,第 18 个小时运行 10 分钟当天。

这就是我现在所拥有的:

Shift_date 状态 Start_timestamp End_Timestamp
---------- --------- --------------- ---------------
5/20/2017 运营 5/20/2017 8:21 5/20/2017 10:40
5/21/2017 延迟 5/20/2017 10:40 5/20/2017 11:10
5/22/2017 运营 5/20/2017 11:10 5/20/2017 13:50

这就是我要的:

Shift_date 小时状态持续时间(分钟)
---------- ---- --------- ----------
5/20/2017 1 .. ..
2017 年 5 月 20 日 ..... ..
5/20/2017 9 运营 39
5/20/2017 10 运营 60
5/20/2017 11 运营 40
5/20/2017 11 延迟 20
5/20/2017 …

sql-server-2008 sql-server

5
推荐指数
2
解决办法
1万
查看次数

首字母大写,例外

我需要正确格式化一些欧洲地址。其中一个步骤是将第一个字母大写,但要避免一些特定的词,例如“on”、“on”、“von”、“van”、“di”、“in”、“sul”。因此,虽然我的技能稀缺,但我认为使用基于 RegEx 的函数是个好主意。

经过一番谷歌搜索后,我在这里找到了这个:

CREATE FUNCTION InitialCap
(
    @String nvarchar(max)
)
    RETURNS nvarchar(max)
AS
    BEGIN 
        DECLARE @Position INT;

        SELECT 
            @String   = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) COLLATE Latin1_General_Bin,
            @Position = PATINDEX('%[^A-Za-z][a-z]%',@String COLLATE Latin1_General_Bin);

        WHILE @Position > 0
            SELECT 
                @String   = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin,
                @Position = PATINDEX('%[^A-Za-z][a-z]%',@String COLLATE Latin1_General_Bin);

        RETURN @String;
    END
Run Code Online (Sandbox Code Playgroud)

这似乎是在寻找一个“非字母”+一个小写“字母”的序列

[^A-Za-z][a-z]
Run Code Online (Sandbox Code Playgroud)

好的,我想我已经了解它是如何工作的,并且我对其进行了修改以最好地满足我的需求。

我认为最好搜索一个空格或 ' 或 - 和一个小写字母,因此我将其更改为

[\s'-][\w]
Run Code Online (Sandbox Code Playgroud)

然后,经过多次尝试,我在 regexr.com 上构建了这个 RegEx,它似乎捕获了所需的序列:

[\s](?!di\s|in\s|sul\s|on\s|upon\s|von\s|uber\s|ueber\s)[\w]
Run Code Online (Sandbox Code Playgroud)

但是当我把它放到上面的函数中时,结果并不像预期的那样。

怎么了?

sql-server sql-server-2014 regex

5
推荐指数
2
解决办法
1599
查看次数

如何列出所有过去的远程登录信息

我和我的同事没有使用“远程桌面”连接到 SQL Server,而是使用 SQL Server Management Studio 将更改应用于远程服务器(每个用户都有自己的凭据)。

我们中的一个人对 SQL 表进行了一些更改,这使所有数据都处于危险之中。我很确定我们中的一个人是有罪的。我的问题是这个。我怎样才能证明这一点?是否有任何类型的查询来显示从客户端到远程 SQL Server 实例的所有过去的远程连接?也许有 IP 地址、计算机名称、凭据。

SQL Server Management Studio 是否有某种日志文件或任何查询来显示远程服务器登录?

PS 远程 SQL Server 实例上没有完整备份。日志很干净。

这是我们登录 SQL Server 的方式:

这就是我们登录SQL的方式

sql-server audit logs t-sql sql-server-2008-r2

4
推荐指数
2
解决办法
4万
查看次数

如何在 SQL Server 中执行 UPSERT,返回预先更新的值?

所有语法都是有效的 PostgreSQL 作为 UPSERT 的示例,它返回字段的旧值和新值。比方说,我有一个表foo(1,A)...(5,E)

CREATE TEMP TABLE foo
AS
  SELECT id, chr(id+64)
  FROM generate_series(1,5) AS t(id);
CREATE UNIQUE INDEX ON foo(id);

 id | chr 
----+-----
 1  | A
 2  | B
 3  | C
 4  | D
 5  | E
(5 rows)
Run Code Online (Sandbox Code Playgroud)

现在,假设我想要 UPSERT 6 行。一些碰撞,一些新的行。

SELECT id, chr(id+74)
FROM generate_series(3,8) AS t(id);
 id | chr 
----+-----
  3 | M
  4 | N
  5 | O
  6 | P
  7 | Q
  8 | R …
Run Code Online (Sandbox Code Playgroud)

sql-server insert update upsert

4
推荐指数
1
解决办法
1505
查看次数

查看现有的表值参数

我看过很多关于如何创建表值参数的教程 - 但是如何在创建表值参数后查看它?

我更喜欢在 SSMS 中使用 GUI 的方法,但 T-SQL 也足够了。

sql-server t-sql sql-server-2008-r2 table-valued-parameters

4
推荐指数
1
解决办法
1157
查看次数

Windows Server 2012 R2 Essentials 和 SQL Server 2014

首先,我不是专业的 IT 人员。我从戴尔为我们的极小型企业购买了一台服务器。它附带已安装的 Windows Server 2012 R2 Essentials。请注意,我得到这台服务器的主要原因是我们使用的一个设计软件必须利用 SQL Server,以便所有工作站共享数据文件。软件公司来为我进行设置并说我们无法在域控制器上安装 SQL Server 2014(对于为什么我仍然有点不知所措)。

我的问题如下:

– 有没有办法格式化服务器并重新安装 WS 2012 R2 E 而不将其设置为域控制器,以便 SQL Server 2014 可以工作?

其他信息,如果它可能相关:

  • 该服务器是新的,上面没有相关信息或数据,因此可以擦除它(假设这意味着在其上重新安装 WS)。

  • 这是一款 AutoDesk 产品。

  • 我们正在使用 Microvellum。

sql-server installation sql-server-2014

4
推荐指数
1
解决办法
1092
查看次数

如何获取有关 Postgres 10 中新标识列背后的序列的信息?(生成 { 始终 | 默认} 作为身份)

Postgres 10 带来了 SQL 标准GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY特性的实现,松散地称为标识列。这个特性取代了 Postgres 自己的SERIAL伪类型,消除了它的问题/问题。有关更多信息,请参阅此处此处

GENERATED…优于的主要原因之一SERIAL是序列号生成器在后台透明处理。我们可以添加列、调整当前序列号和删除列,所有这些都无需明确引用序列。

CREATE TABLE tbl (
    col  BIGINT 
         GENERATED ALWAYS AS IDENTITY 
         PRIMARY KEY ,
    col2 text
) 
;
Run Code Online (Sandbox Code Playgroud)

和…

ALTER TABLE tbl
ALTER COLUMN col
RESTART WITH 1000
;
Run Code Online (Sandbox Code Playgroud)

和…

ALTER TABLE tbl
ALTER COLUMN col
DROP IDENTITY IF EXISTS
;
Run Code Online (Sandbox Code Playgroud)

或者…

ALTER TABLE tbl
ALTER COLUMN col
DROP COLUMN IF EXISTS …
Run Code Online (Sandbox Code Playgroud)

postgresql identity postgresql-10

4
推荐指数
1
解决办法
5136
查看次数

排除具有可能重复的连续数据的行

我有一个表格显示特定设备在给定时间戳的状态(0 - 损坏,1 - 实时):

device_owner   device_id    timestamp          status
owner1         device_1     2001-01-01 09:00   0    -- leave this
owner1         device_1     2001-01-01 09:05   0    -- exclude
owner1         device_1     2001-01-01 09:10   0    -- exclude
owner1         device_2     2001-01-01 09:15   0    -- leave this
owner1         device_1     2001-01-01 09:30   1    
owner1         device_2     2001-01-01 09:35   0    -- exclude
owner1         device_2     2001-01-01 09:45   1
owner1         device_1     2001-01-01 09:55   0    --leave this
owner1         device_1     2001-01-01 10:10   0    --exclude
owner1         device_1     2001-01-01 10:11   1    
Run Code Online (Sandbox Code Playgroud)

等等。

我需要排除连续的零状态,并保留日期时间最早的状态。(这样我就可以定义设备损坏和活动之间的日期时间差异。)

结果:

device_owner   device_id    timestamp …
Run Code Online (Sandbox Code Playgroud)

sql-server greatest-n-per-group

4
推荐指数
1
解决办法
297
查看次数

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

我有一个这样的表:

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
    )

);
Run Code Online (Sandbox Code Playgroud)

该表将保存预先CodeNumber分配给 s 的 …

index sql-server sql-server-2014 unique-constraint computed-column

4
推荐指数
1
解决办法
203
查看次数