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

VansFannel's questions

Martin Hope
VansFannel
Asked: 2024-06-29 17:16:48 +0800 CST

按照我使用 Sqlite3 插入的顺序返回数据

  • 4

我想我正在使用最新版本的 Sqlite 和 C++。我有一张包含数据的表,我需要按照插入顺序返回这些数据。

我是否可以保证这些列始终会按照此顺序返回?

在此处输入图片描述

也许我必须添加另一列来设置顺序并使用 ORDER BY:

在此处输入图片描述

sqlite
  • 1 个回答
  • 17 Views
Martin Hope
VansFannel
Asked: 2020-03-19 00:59:03 +0800 CST

将三个查询合二为一

  • 0

我正在使用 SQL Server 13.0.5102.14。

我有这三个表:

CREATE TABLE [dbo].[ProductionOrder]
(
    [ProductionOrderId] INT NOT NULL IDENTITY (1, 1), 
    [ProductId] INT NOT NULL, 
    [Name] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_ProductionOrder] PRIMARY KEY CLUSTERED 
    (
        [ProductionOrderId] ASC
    ))
)

CREATE TABLE [dbo].[Code]
(
    [CodeId] int NOT NULL IDENTITY(1, 1),
    [Serial] [varchar](38) not null,
    [ProductionOrderId] int NOT NULL,
    [AggregationLevel] [tinyint] NOT NULL,
     CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED 
    (
        [CodeId] ASC
    ),
    CONSTRAINT [UC_Code_Serial] UNIQUE ([Serial]),
    CONSTRAINT [FK_Code_ProductionOrder_ProductionOrderId] FOREIGN KEY ([ProductionOrderId]) REFERENCES [dbo].[ProductionOrder] ([ProductionOrderId]))
)

CREATE TABLE [dbo].[VariableData]
(
    [ProductionOrderId] INT NOT NULL,
    [AggregationLevelConfigurationId] TINYINT NOT NULL, 
    [VariableDataId] VARCHAR(4) NOT NULL, 
    [Value] NVARCHAR(200) NOT NULL,
    CONSTRAINT [PK_VariableData] PRIMARY KEY CLUSTERED 
    (
        [AggregationLevelConfigurationId] ASC,
        [ProductionOrderId] ASC,
        [VariableDataId] ASC
    ), 
    CONSTRAINT [FK_VariableData_AggregationLevelConfiguration_AggregationLevelConfigurationId] FOREIGN KEY ([AggregationLevelConfigurationId], [ProductionOrderId]) REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId], [ProductionOrderId]) ON DELETE CASCADE,
    CONSTRAINT [FK_VariableData_ProductionOrder_ProductionOrderId] FOREIGN KEY ([ProductionOrderId]) REFERENCES [dbo].[ProductionOrder] ([ProductionOrderId]),
    CONSTRAINT [CK_VariableData_VariableDataId] CHECK (([VariableDataId]<>N''))
)

CREATE TABLE [dbo].[Product]
(
    [ProductId] INT NOT NULL IDENTITY (1, 1),
    [ProductCode] VARCHAR(14) not null,
    [Description] NVARCHAR(50) NULL,
    [LawId] TINYINT NOT NULL,  
    [Name] NVARCHAR(100) NOT NULL, 
    [Comment] NVARCHAR(100) NULL, 
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
    (
        [ProductId] ASC
    ),
    CONSTRAINT [CK_Product_ProductCode] CHECK (([ProductCode]<>N'')),
    CONSTRAINT [CK_Product_Name] CHECK (([Name]<>N''))
)

CREATE TABLE [dbo].[AggregationChildren]
(
    [AggregationChildrenId] INT NOT NULL,
    [AggregationId] INT NOT NULL,
    [Position] [int] NOT NULL,
    CONSTRAINT [PK_AggregationChildren] PRIMARY KEY CLUSTERED 
    (
        [AggregationChildrenId] ASC
    ), 
    CONSTRAINT [FK_AggregationChildren_Aggregation_AggregationId] FOREIGN KEY ([AggregationId]) REFERENCES [Aggregation]([AggregationId]) ON DELETE CASCADE, 
    CONSTRAINT [FK_AggregationChildren_Code_AggregationChildrenId] FOREIGN KEY ([AggregationChildrenId]) REFERENCES [Code]([CodeId])
)

CREATE TABLE [dbo].[Aggregation]
(
    [AggregationId] INT NOT NULL,
    [Created] varchar(34) NULL,
    CONSTRAINT [PK_Aggregation] PRIMARY KEY CLUSTERED
    (
        [AggregationId] ASC
    ),
    CONSTRAINT [FK_Aggregation_Code_AggregationId] FOREIGN KEY ([AggregationId]) REFERENCES [dbo].[Code] ([CodeId])
)

我有这三个工作查询:

declare @prodID int = 1;
declare @lotAI varchar(4) = '10';

select cod.Serial as ItemNO
     , varData.Value as Lot
     , pro.ProductCode as Product

  from dbo.VariableData varData 
        JOIN dbo.Code cod ON varData.ProductionOrderId = cod.ProductionOrderId
        JOIN dbo.ProductionOrder proOrd ON varData.ProductionOrderId = proOrd.ProductionOrderId
        JOIN dbo.Product pro on proOrd.ProductId = pro.ProductId   

 where varData.ProductionOrderId = @prodID and
       varData.VariableDataId = @lotAI and
       varData.AggregationLevelConfigurationId = 1 and
       cod.AggregationLevel = 1


select cod.Serial as Box

  from dbo.Code cod
       LEFT JOIN dbo.AggregationChildren agg on agg.AggregationId = cod.CodeId

 where cod.ProductionOrderId = @prodID and
       cod.AggregationLevel = 2


select cod.Serial as Pallet

  from dbo.Code cod
       JOIN dbo.Aggregation agg on agg.AggregationId = cod.CodeId

 where cod.ProductionOrderId = @prodID and
       cod.AggregationLevel = 3

我想将所有这些加入到一个查询中。我的问题是我dbo.Code用来获得三个不同的值:

  • select cod.Serial as ItemNO
  • select cod.Serial as Box
  • select cod.Serial as Pallet

如何将这三个查询合二为一?

sql-server
  • 1 个回答
  • 50 Views
Martin Hope
VansFannel
Asked: 2018-05-04 23:52:39 +0800 CST

没有前 n 个字符的子字符串

  • 5

我正在开发 SQL Server 2016 存储过程,我想获取varchar(38)列的最后一个字符。

我知道总会有至少 18 个字符,而且我不知道列的确切长度,因为它是可变的。

我想我可以得到列的长度并做一个减法来使用SUBSTRING,但我不能这样做,因为我正在这样做:

set @externalCodes = (
    select Serial, AggregationLevel
      from ExternalCode where ProductionOrderId = @productionOrderId
    for json path

我正在生成一个 JSON,但我不知道如何获取Serial选择中每列的长度。

我的问题是:如何在不知道其长度的情况下从没有前 18 个字符的字符串中获取子字符串?

一种解决方案可能是:

SUBSTRING(Serial, 18, 38)

它总是返回从 18 到字符串末尾的子字符串,即使字符串的长度不是 38。

sql-server t-sql
  • 2 个回答
  • 19274 Views
Martin Hope
VansFannel
Asked: 2018-04-28 00:09:38 +0800 CST

获取表关系之间涉及的所有行以删除它们

  • 0

继续问题Get all of the rows involved between tables relationships,现在我必须删除这些代码的所有行。我解释一下:

我有一个带有下表的 SQL Server 2016:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            VARCHAR(20)  NOT NULL,
    [AggregationLevelId]  TINYINT      NOT NULL,
    [CommissioningFlag] TINYINT        NOT NULL,
    [ ... ]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
    CONSTRAINT [FK_Code_AggregationLevelConfiguration]
           FOREIGN KEY ([AggregationLevelId])
            REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)

CREATE TABLE [dbo].[Aggregation] (
    [AggregationId] INT           NOT NULL,
    CONSTRAINT [PK_AGGREGATIONS] PRIMARY KEY CLUSTERED ([AggregationId] ASC),
    CONSTRAINT [FK_Aggregation_Code]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Code] ([CodeId])
)

CREATE TABLE [dbo].[AggregationChildren] (
    [AggregationChildrenId] INT NOT NULL,
    [AggregationId]         INT NOT NULL,
    [Position]              INT NOT NULL,
    CONSTRAINT [PK_AGGREGATION_CHILDS] PRIMARY KEY CLUSTERED ([AggregationChildrenId] ASC),
    CONSTRAINT [FK_AggregationChildren_Code]
           FOREIGN KEY ([AggregationChildrenId])
            REFERENCES [dbo].[Code] ([CodeId]),
    CONSTRAINT [FK_AggregationChildren_Aggregation]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Aggregation] ([AggregationId]) ON DELETE CASCADE
)

Aggregation并AggregationChildren表示表中行之间的关系Code。

聚合将有 1 个或多个子聚合。而且,聚合子项中的代码可以有 0 个或多个聚合子项。

它是这样的:

Code1
|___________________
|                   |
Code2               Code3
|________           |________________
|        |          |        |       |
Code4    Code5      Code6    Code7   Code8

以上都是Code.Serial价值观。

Code.CodeId这些连续出版物的所有值都在和的Aggregation表Code1中。Code2Code3

并且,对于那些连续剧,Code2、Code3、Code4、Code5、Code6、Code7和Code8在AggregationChildren表中。

Aggregation我需要从和AggregationChildren表中删除那些连续出版物的行。

使用上一个问题的答案,我尝试这样做:

DECLARE @Serial VARCHAR(20) = 'Code1';

;WITH rc AS
(
    SELECT AggregationId Id
    FROM   dbo.Aggregation
    WHERE  AggregationId = (SELECT CodeId FROM dbo.Code WHERE Serial = @Serial)
    UNION ALL
    SELECT ac.AggregationChildrenId Id
    FROM   dbo.AggregationChildren ac
    JOIN   rc
    ON     ac.AggregationId = rc.Id
)
UPDATE c
SET    CommissioningFlag = 130
FROM   dbo.Code c
JOIN   rc
ON     c.CodeId = rc.Id;
GO

Delete ag from dbo.Aggregation ag
inner join rc 
on ag.AggregationId = rc.Id;

但我不知道如何使用DELETE FROMwithrc语句。但我想我只需要Codes在Aggregation和中的那些AggregationChildren。也许我需要修改With语句以首先获取表中的行,Aggregation因为我有一个ON DELETE CASCADEinAggregationChildren表。

如何从Aggregation表中删除所有代码?

sql-server t-sql
  • 1 个回答
  • 38 Views
Martin Hope
VansFannel
Asked: 2018-04-27 02:11:14 +0800 CST

获取表关系之间涉及的所有行

  • 2

我有一个带有下表的 SQL Server 2016:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            VARCHAR(20)  NOT NULL,
    [AggregationLevelId]  TINYINT      NOT NULL,
    [CommissioningFlag] TINYINT        NOT NULL,
    [ ... ]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
    CONSTRAINT [FK_Code_AggregationLevelConfiguration]
           FOREIGN KEY ([AggregationLevelId])
            REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)

CREATE TABLE [dbo].[Aggregation] (
    [AggregationId] INT           NOT NULL,
    CONSTRAINT [PK_AGGREGATIONS] PRIMARY KEY CLUSTERED ([AggregationId] ASC),
    CONSTRAINT [FK_Aggregation_Code]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Code] ([CodeId])
)

CREATE TABLE [dbo].[AggregationChildren] (
    [AggregationChildrenId] INT NOT NULL,
    [AggregationId]         INT NOT NULL,
    [Position]              INT NOT NULL,
    CONSTRAINT [PK_AGGREGATION_CHILDS] PRIMARY KEY CLUSTERED ([AggregationChildrenId] ASC),
    CONSTRAINT [FK_AggregationChildren_Code]
           FOREIGN KEY ([AggregationChildrenId])
            REFERENCES [dbo].[Code] ([CodeId]),
    CONSTRAINT [FK_AggregationChildren_Aggregation]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Aggregation] ([AggregationId]) ON DELETE CASCADE
)

Aggregation并AggregationChildren表示表中行之间的关系Code。

聚合将有 1 个或多个子聚合。而且,聚合子项中的代码可以有 0 个或多个聚合子项。

它是这样的:

Code1
|___________________
|                   |
Code2               Code3
|________           |________________
|        |          |        |       |
Code4    Code5      Code6    Code7   Code8

以上都是Code.Serial价值观。

Code.CodeId这些连续出版物的所有值都在和的Aggregation表Code1中。Code2Code3

并且,对于那些连续剧,Code2、Code3、Code4、Code5、Code6、Code7和Code8在AggregationChildren表中。

我需要更新Code.CommissioningFlag所有这些连续剧。

我创建了一个存储过程来递归调用。我作为参数传递Code1,它将对Code2and进行递归调用Code3。

此方法适用于一些代码,但现在,我必须更新 3,000 个代码,它会阻止 SQL Server。

我以为我已经导航抛出“树”并获得一个包含所有代码的临时表,以及所有代码的执行和更新,但我不知道如何在 SQL 中“导航树”。

我怎样才能让所有的代码一次更新所有的代码?

sql-server t-sql
  • 1 个回答
  • 56 Views
Martin Hope
VansFannel
Asked: 2018-03-21 02:53:04 +0800 CST

从我的数据库中授予用户执行 xp_cmdshell

  • 2

我正在使用 SQL Server 2016,我需要让用户从中MyDatabase执行xp_cmdshell。我执行以下操作:

USE [MyDatabase]
GO

GRANT EXECUTE ON xp_cmdshell TO myUser
GO

myUser是来自的用户MyDatabase,当我运行上述代码时,登录为sa,我收到以下错误:

仅当当前数据库为主数据库时,才能授予对服务器范围目录视图或系统存储过程或扩展存储过程的权限。

我需要将用户添加到master数据库吗?我不认为这是安全的。

我需要这个,因为我想从存储过程中编写一个文本文件。我找到了以下文章http://www.nigelrivett.net/WriteTextFile.html,说我可以使用以下方式编写文本文件:

You will need to create the data to be output as in dynamic sql statements
The first command here creates or overwrites the file - the rest append to the file.
exec master..xp_cmdshell 'echo hello > c:\file.txt'
exec master..xp_cmdshell 'echo appended data >> c:\file.txt'
exec master..xp_cmdshell 'echo more data >> c:\file.txt'

我问这个是因为我的存储过程会生成一个大字符串 (nvarchar(max)) json,当我尝试用 C# 写下它时,我什么也没得到:既不是文件也不是异常。我曾想过在存储过程中编写 json 字符串(如果可以的话)。

存储过程正确结束,我在调试器中检查了我在输出参数 json 中得到了一些东西(我知道是因为 Visual Studio 设置没有足够的内存来显示它的内容),File.WriteAllText因为我有一个断点而运行它,而且,路径是绝对的。但也许,有些事情我忽略了,我必须再次仔细检查所有内容。

sql-server permissions
  • 2 个回答
  • 3169 Views
Martin Hope
VansFannel
Asked: 2018-03-09 05:45:26 +0800 CST

使用 OPENJSON 生成嵌套数组非常慢

  • 2

我刚开始使用OPENJSONSQL Server 2016 SP1。

我有这样一句话:

select c.Serial as Parent,
    (Select co.Serial, agc.Position
      from AggregationChildren agc, Aggregation ag, Code co
      where agc.AggregationId = a.AggregationId 
      and co.CodeId = agc.AggregationChildrenId for json path) as children
    from Aggregation a, Code c
    where c.CodeId = a.AggregationId for json path

要生成此 JSON:

{"Parent":"4244287599479491","Children":
[{"Serial":"8915753733724633","Position":"1"},
{"Serial":"1247782815710855","Position":"2"},
...]}

但它非常非常慢。

我的问题是Children数组,因为我不知道如何获取它。

有没有办法做得更快?

这些是表格:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [ ... ],
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    [ ... ]
)

CREATE TABLE [dbo].[Aggregation] (
    [AggregationId] INT           NOT NULL,
    [ ... ], 
    CONSTRAINT [PK_AGGREGATIONS] PRIMARY KEY CLUSTERED ([AggregationId] ASC),
    CONSTRAINT [FK_Aggregation_Code]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Code] ([CodeId])
)

CREATE TABLE [dbo].[AggregationChildren] (
    [AggregationChildrenId] INT NOT NULL,
    [AggregationId]         INT NOT NULL,
    [Position]              INT NOT NULL,
    CONSTRAINT [PK_AGGREGATION_CHILDS] PRIMARY KEY CLUSTERED ([AggregationChildrenId] ASC),
    CONSTRAINT [FK_AggregationChildren_Code]
           FOREIGN KEY ([AggregationChildrenId])
            REFERENCES [dbo].[Code] ([CodeId]),
    CONSTRAINT [FK_AggregationChildren_Aggregation]
           FOREIGN KEY ([AggregationId])
            REFERENCES [dbo].[Aggregation] ([AggregationId]) ON DELETE CASCADE
)

该Serial列是一个,nvarchar(20)因为值可以是字母数字的任意组合,即使我的示例只显示数字。

sql-server json
  • 1 个回答
  • 1399 Views
Martin Hope
VansFannel
Asked: 2018-03-01 01:14:24 +0800 CST

嵌套选择:使用两个子查询将值插入表中

  • 0

我正在为 SQL Server 2016 开发存储过程。

我必须这样做(下面的 sql 语句不起作用):

Insert into AggregationChildren (AggregationId, AggregationChildrenId, Position)
SELECT Parent, Serial, Position
FROM
    OPENJSON (@json, '$.Aggregations')
    WITH (  Parent nvarchar(20) '$.Parent',
            Children nvarchar(max) AS JSON )
        CROSS APPLY 
            OPENJSON (Children)
            WITH ( Serial nvarchar(20), Position int)

我的问题是AggregationIdand是AggregationChildrenId整数和Parentand 。Serialnvarchar(20)

和 之间存在关系Parent,AggregationId和 之间存在Serial关系AggregationChildrenId。我可以用Code桌子得到它。

我知道当我必须为一列插入值时我该怎么做:

Insert into AggregationChildren (AggregationId)
    Select CodeId from Code Where Serial = (SELECT Parent
    FROM
        OPENJSON (@json, '$.Aggregations')
        WITH (  Parent nvarchar(20) '$.Parent',
                Children nvarchar(max) AS JSON )
            CROSS APPLY 
                OPENJSON (Children)
                WITH ( Serial nvarchar(20), Position int))

我要插入的数据是:

{
    ...,
    "Aggregations": [{
        "Parent": "88962730000000004051",
        "Children": [{
            "Serial": "81861400000000020227",
            "Position": "1"
        }, {
            "Serial": "81861400000000033191",
            "Position": "2"
        }, {
            "Serial": "81861400000000046051",
            "Position": "3"
        },
        ...
        ]
    }, {
        "Parent": "88962730000000016653",
        "Children": [{
            "Serial": "81861400000001825849",
            "Position": "1"
        }, {
            "Serial": "81861400000001832643",
            "Position": "2"
        }, {
            "Serial": "81861400000001841911",
            "Position": "3"
        }, {
            "Serial": "81861400000001850803",
            "Position": "4"
        }, {
            "Serial": "81861400000001862474",
            "Position": "5"
        }, {
            "Serial": "81861400000001874774",
            "Position": "6"
        }, {
            "Serial": "81861400000001884159",
            "Position": "7"
        }, {
            "Serial": "81861400000001898352",
            "Position": "8"
        }, {
            "Serial": "81861400000001904764",
            "Position": "9"
        },
        ...
        ]
    }]
}

但是,如果我必须使用两个,我该怎么办Select CodeId from Code Where Serial = (SELECT ...?

我想我必须做这样的事情,但不做同样的选择三次:

 Insert into AggregationChildren (AggregationId, AggregationChildrenId, Position)
    Select CodeId from Code Where Serial = (SELECT Parent
    FROM
        OPENJSON (@json, '$.Aggregations')
        WITH (  Parent nvarchar(20) '$.Parent',
                Children nvarchar(max) AS JSON )
            CROSS APPLY
                OPENJSON (Children)
                WITH ( Serial nvarchar(20), Position int)), 
    Select CodeId from Code Where Serial = (SELECT Serial
    FROM
        OPENJSON (@json, '$.Aggregations')
        WITH (  Parent nvarchar(20) '$.Parent',
                Children nvarchar(max) AS JSON )
            CROSS APPLY
                OPENJSON (Children)
                WITH ( Serial nvarchar(20), Position int)), 
    SELECT Position
    FROM
        OPENJSON (@json, '$.Aggregations')
        WITH (  Parent nvarchar(20) '$.Parent',
                Children nvarchar(max) AS JSON )
            CROSS APPLY
                OPENJSON (Children)
                WITH ( Serial nvarchar(20), Position int)
sql-server t-sql
  • 1 个回答
  • 2651 Views
Martin Hope
VansFannel
Asked: 2016-10-03 22:12:28 +0800 CST

优化一个 UNIQUE CONSTRAINT 让 SELECT 更快

  • 2

我在 SQL Server 2012 SP3 上有一个带有此表的数据库:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [AggregationLevelId]  TINYINT      NOT NULL,
    [...],
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)

使用 Sql Server Management Studio Activity Monitor 我看到以下选择的平均持续时间为 32 毫秒。

set @maxCode = (select max(Serial) from Code where AggregationLevelId = @codeLevel);

有什么办法可以改善吗?我问这个是因为我不知道是否可以向具有唯一约束的列添加新索引。

更新:

Code表也​​有这个索引:

CREATE NONCLUSTERED INDEX [ix255] ON [dbo].[Code]
(
    [AggregationLevelId] ASC
)
INCLUDE (   [Serial],
    [CodeId]) 
WHERE ([CommissioningFlag]=(255))
sql-server database-design
  • 1 个回答
  • 1353 Views
Martin Hope
VansFannel
Asked: 2016-09-30 01:35:08 +0800 CST

我的观点是否会减慢更新速度?

  • 2

我有一个经常运行更新语句的 SQL Server 数据库。我在 Activity Monitor 上看到这个更新语句触发 27ms,我想改进它。

我检查了执行计划,我看到更新语句更新了视图的索引: 在此处输入图像描述

更新查询是这样的:

UPDATE Code
    SET CommissioningFlag = @newCommFlagValue
                , Source = @source
                , UserName = @username
                , LastChange = CAST(SYSDATETIMEOFFSET() as nvarchar(50))
                , SentToNextLevel = 0
                , HelperCodeId = @helperCodeId
WHERE CodeId = @codeId

视图突出显示的脚本是:

CREATE VIEW dbo.PrintedCodesStatistics
WITH SCHEMABINDING
AS
    SELECT AggregationLevelId, COUNT_BIG(*) as CodesPrinted
    FROM dbo.Code
    WHERE   (CommissioningFlag != 255)
    GROUP BY AggregationLevelId

GO
CREATE UNIQUE CLUSTERED INDEX [IX_Printed_Statistics]
    ON [dbo].[PrintedCodesStatistics]([AggregationLevelId] ASC);

最后,Code表脚本:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [AggregationLevelId]  TINYINT      NOT NULL,
    [CommissioningFlag] TINYINT        NOT NULL,
    [... ]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)

视图是否会减慢更新查询的速度?

sql-server optimization
  • 1 个回答
  • 390 Views
Martin Hope
VansFannel
Asked: 2016-09-29 22:45:13 +0800 CST

优化两条sql语句加索引

  • 4

我正在使用 SQL Server Management Studio 活动监视器优化我的 SQL Server 数据库。

比较昂贵的两条sql语句是:

set @codesToPrintCount = 
    (select count(CodeId)
        from Code
        where CommissioningFlag = 255
        and AggregationLevelId = @codeLevel);

SET @code = (SELECT TOP 1 Serial
                FROM Code
                WHERE CommissioningFlag = 255
                    and AggregationLevelId = @codeLevel);

这是Code表sql脚本:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [AggregationLevelId]  TINYINT      NOT NULL,
    [CommissioningFlag] TINYINT        NOT NULL,
    [ ... ]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC),
    CONSTRAINT [FK_Code_AggregationLevelConfiguration]
           FOREIGN KEY ([AggregationLevelId])
            REFERENCES [dbo].[AggregationLevelConfiguration] ([AggregationLevelConfigurationId])
)

我不知道如何加快这些句子的速度。

该Code表中 column 上具有相同值的AggregationLevelId行多于 上 值为 255 的列CommissioningFlag。换句话说,Code表中有 1.050.000 行AggregationLevelId等于@codeLevel和 32 行或更少列中的值为 255 CommissioningFlag。

在此表上添加两个索引是个好主意吗?一个用于CommissioningFlag,另一个用于AggregationLevelId。

此时Code表上有 1.100.000 行,它们分别得到 23ms 和 78ms 的执行时间。

顺便说一句,这两句话是在存储过程中的。

sql-server performance
  • 1 个回答
  • 314 Views
Martin Hope
VansFannel
Asked: 2016-09-29 06:57:04 +0800 CST

更新表比 INNER JOIN 快

  • 2

我有一个带有内部连接的 SQL Server 2012 存储过程,执行时间为 7,387 毫秒(我在 Activity Monitor 中看到了它):

[...]
declare @childrenIds as dbo.CodeIdList;

[...]
Update
    dbo.Code
set
    dbo.Code.CommissioningFlag = 21
From 
    dbo.Code
INNER JOIN
    @childrenIds c
ON
    dbo.Code.CodeId =  c.CodeId

CodeIdList是:

CREATE TYPE [dbo].[CodeIdList] AS TABLE (
    [CodeId] INT NULL
);

有没有比使用 更新代码表更快的方法INNER JOIN?

我不是 dba,所以我不知道您是否需要有关我的问题的更多详细信息。如果您需要它们,请询问。

我sp_helpindex在代码表上运行了这些结果:

索引名称 | index_description
PK_CODE | 位于 PRIMARY 上的聚集的、唯一的主键 | 代码ID
UC_CODE_SERIAL | 位于 PRIMARY | 上的非聚集、唯一、唯一键 串行

Code建表脚本:

CREATE TABLE [dbo].[Code] (
    [CodeId]            INT            IDENTITY (1, 1) NOT NULL,
    [Serial]            NVARCHAR (20)  NOT NULL,
    [ ...]
    CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
    CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)

此时代码表中有 1.006.896 行。

执行计划:

在此处输入图像描述

XML 版本位于http://pastebin.com/9yXsRfva

SQL Server 版本信息:

Microsoft SQL Server Management Studio 11.0.6020.0 Herramientas cliente de Microsoft Analysis Services 11.0.6020.0 Microsoft Data Access Components (MDAC) 6.1.7601.17514
微软 MSXML 3.0 4.0 6.0
微软 Internet Explorer 9.11.9600.18314
微软 .NET 框架 4.0.30319.42000
手术系统 6.1.7601

Select @@VERSION:

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
2015 年 10 月 20 日 15:36:27
版权所有 (c) Microsoft Corporation Enterprise Edition(64 位)
Windows NT 6.1(内部版本 7601:Service Pack 1)
sql-server performance
  • 4 个回答
  • 3372 Views
Martin Hope
VansFannel
Asked: 2016-01-12 05:46:11 +0800 CST

检查用户是否存在于 SQL Server 数据库中

  • 51

我正在使用 SQL Server 2012。我想在将用户添加到数据库之前检查它是否存在。

这是我测试过的:

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT name 
                FROM [sys].[server_principals]
                WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO

但是,SELECT name FROM [sys].[server_principals]如果该用户存在于MyDatabase.

如何检查用户是否存在MyDatabase?

sql-server sql-server-2012
  • 4 个回答
  • 118207 Views
Martin Hope
VansFannel
Asked: 2015-09-18 23:56:21 +0800 CST

空列可以是主键的一部分吗?

  • 24

我正在开发一个 SQL Server 2012 数据库,我有一个关于一对零或一关系的问题。

我有两张桌子,Codes和HelperCodes。一个代码可以有零个或一个帮助代码。这是创建这两个表及其关系的 sql 脚本:

CREATE TABLE [dbo].[Code]
(
    [Id] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [SentToRanger] BIT NOT NULL DEFAULT 0, 
    [LastChange] NVARCHAR(50) NOT NULL, 
    [UserName] NVARCHAR(50) NOT NULL, 
    [Source] NVARCHAR(50) NOT NULL, 
    [Reason] NVARCHAR(200) NULL, 
    [HelperCodeId] NVARCHAR(20) NULL,
    CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ),
    CONSTRAINT [FK_Code_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level]),
    CONSTRAINT [FK_Code_HelperCode]
       FOREIGN KEY ([HelperCodeId])
        REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)

CREATE TABLE [dbo].[HelperCode]
(
    [HelperCodeId] NVARCHAR(20) NOT NULL, 
    [Level] TINYINT NOT NULL, 
    [CommissioningFlag] TINYINT NOT NULL, 
    [LastChange] NVARCHAR(50) NOT NULL,
    CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
    (
        [HelperCodeId] ASC
    ),
    CONSTRAINT [FK_HelperCode_LevelConfiguration]
       FOREIGN KEY ([Level])
        REFERENCES [dbo].[LevelConfiguration] ([Level])
)

那是对的吗?

Code 和 HelperCode 都是不同的实体。HelperCode 可以是已使用的(没有代码引用它),也可以是已使用的(只有一个代码引用它)。

也许 Code.HelperCodeId 必须是 Code 表主键的一部分。但我不确定空列是否可以成为主列的一部分。这样做,我想防止两个或多个代码引用相同的 HelperCode。

database-design sql-server-2012
  • 2 个回答
  • 35555 Views
Martin Hope
VansFannel
Asked: 2015-07-01 02:58:45 +0800 CST

使用 sa 用户将 xp_logevent 上的执行权限授予 sa

  • 2

使用以下代码运行 SQL Server 2012 CLR 存储过程:

const string executeLog = "EXEC master..xp_logevent @errorNumber, @message, informational";
using (SqlCommand cmd = new SqlCommand(executeLog, connection))
{
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@errorNumber", 60001);
    cmd.Parameters.AddWithValue("@message", url);

    cmd.ExecuteScalar();
}

我收到此错误:

System.Data.SqlClient.SqlException:对对象“xp_logevent”、数据库“mssqlsystemresource”、架构“sys”的执行权限被拒绝。

我尝试以sa用户身份执行此操作:

grant execute on xp_logevent to sa

但我得到另一个错误:

您找不到不存在的用户“sa”或用户没有权限。

如何向 sa 用户授予执行权限?

sql-server c#
  • 2 个回答
  • 3361 Views
Martin Hope
VansFannel
Asked: 2015-03-18 08:09:59 +0800 CST

我该如何改进此更新?

  • 1

我正在使用 SQL Server 2014 Express 版本,我想上传一些 OpenStreetMaps 数据。

数据是一个 172 Mb 的 XML,它加载正常。问题出在这个脚本上:

UPDATE ways
SET geog4326 = 'LINESTRING(' + STUFF((
SELECT ',' + CAST(CAST(n.Longitude AS decimal(18,9)) AS varchar(32)) + ' ' + CAST(CAST(n.Latitude AS decimal(18,9)) AS varchar(32)) AS [text()]
FROM
ways w JOIN waynodes wn ON w.wayid = wn.wayid
JOIN nodes n ON wn.nodeid = n.nodeid
WHERE wn.wayid = w.wayid
ORDER BY w.wayid, orderid
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)'),1,1,'') +')'

我在 SQL Server Management Studio 上得到一个内存不足的 .NET 框架,并且还从 SQLCMD 运行它。 ways表有 101,393 行和waynodes1,018,575 行。

你知道我该如何改进这个脚本吗?

顺便说一句,我从本教程中获得了这个脚本。

我没有索引,也没有执行计划。我只是按照教程进行操作,但出现内存不足错误。

sql-server performance
  • 1 个回答
  • 127 Views
Martin Hope
VansFannel
Asked: 2014-10-31 06:26:03 +0800 CST

xp_logevent 参数类型无效

  • 1

我在 Windows 7 32 位上使用 SQL Server 2012 Enterprise Edition SP2。

我在存储过程中有这段代码。

Begin try
    -- EXEC CLR Stored Procedure
    exec dbo.MyStoredProcedureCLR @baseUrl, @orderNumber
end try
begin catch
    Declare @message nvarchar(max);

    set @message = ERROR_MESSAGE()
    EXEC master..xp_logevent 60000, @message, informational
end catch

MyStoredProcedureCLR是一个 SQL CLR 存储过程,它对 RESTful Web 服务进行 PUT。

有时,我遇到404 Not Found异常,我想捕获它并记录它。这是我收到的消息:

A .NET Framework error occurred during execution of user-defined routine or aggregate "GetNewCodesICODECLR": 
System.Net.WebException: Error en el servidor remoto: (404) No se encontró.
System.Net.WebException: 
   en System.Net.HttpWebRequest.GetResponse()
   en StoredProcedures.GetNewCodesICODECLR(SqlString baseUrl, SqlString orderNumber, SqlString lineCode, Int64 quantity, Int64 codesPrinted, Int64 codesCleared)

但是,当我得到那个例外时,我得到另一个例外xp_logevent:

'执行扩展存储过程时出错:参数类型无效'

我怎么知道ERROR_MESSAGE()是一个有效参数?或者发生了什么事?

顺便说一下,我在 Service Broker 队列中运行那个 SQL CLR 存储过程。

sql-server logs
  • 1 个回答
  • 1133 Views
Martin Hope
VansFannel
Asked: 2014-05-30 22:53:47 +0800 CST

这个数据库设计是否正确?

  • 0

我试图代表这一点:

  • 可以将消息发送给一个或多个收件人。
  • 用户(收件人)可以收到零条或多条消息(但他/她只能收到一次消息)。

我的数据库设计是否正确?

在此处输入图像描述

database-design
  • 2 个回答
  • 86 Views
Martin Hope
VansFannel
Asked: 2014-05-26 06:46:22 +0800 CST

这种多对多关系是否正确?[复制]

  • 3
这个问题在这里已经有了答案:
我不知道如何阅读多对多关系 (2 个答案)
8 年前关闭。

我正在阅读本教程,对此我有疑问。

看这张图片:

在此处输入图像描述

'阅读'的逻辑关系我读到一个Project必须有一个或多个Employee。但是物理实现有一个项目可以有零个或多个ProjectEmployee。

或者也许我错了,物理实现是正确的。

你怎么看?

database-design
  • 1 个回答
  • 498 Views
Martin Hope
VansFannel
Asked: 2014-05-25 01:52:06 +0800 CST

如何用乌鸦脚图表示多对多关系

  • 4

我正在设计一个数据库,我想表示用户和组之间的关系:

一个用户可以在零个或多个组上。一个组可以有一个或多个用户。

我使用 Microsoft Visio 2013 绘制了此图:

在此处输入图像描述

是正确的?

database-design
  • 1 个回答
  • 4610 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