我想我正在使用最新版本的 Sqlite 和 C++。我有一张包含数据的表,我需要按照插入顺序返回这些数据。
我是否可以保证这些列始终会按照此顺序返回?
也许我必须添加另一列来设置顺序并使用 ORDER BY:
我正在使用 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 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。
继续问题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
中。Code2
Code3
并且,对于那些连续剧,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 FROM
withrc
语句。但我想我只需要Codes
在Aggregation
和中的那些AggregationChildren
。也许我需要修改With
语句以首先获取表中的行,Aggregation
因为我有一个ON DELETE CASCADE
inAggregationChildren
表。
如何从Aggregation
表中删除所有代码?
我有一个带有下表的 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
中。Code2
Code3
并且,对于那些连续剧,Code2
、Code3
、Code4
、Code5
、Code6
、Code7
和Code8
在AggregationChildren
表中。
我需要更新Code.CommissioningFlag
所有这些连续剧。
我创建了一个存储过程来递归调用。我作为参数传递Code1
,它将对Code2
and进行递归调用Code3
。
此方法适用于一些代码,但现在,我必须更新 3,000 个代码,它会阻止 SQL Server。
我以为我已经导航抛出“树”并获得一个包含所有代码的临时表,以及所有代码的执行和更新,但我不知道如何在 SQL 中“导航树”。
我怎样才能让所有的代码一次更新所有的代码?
我正在使用 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
因为我有一个断点而运行它,而且,路径是绝对的。但也许,有些事情我忽略了,我必须再次仔细检查所有内容。
我刚开始使用OPENJSON
SQL 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 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)
我的问题是AggregationId
and是AggregationChildrenId
整数和Parent
and 。Serial
nvarchar(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 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 数据库。我在 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 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 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 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 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。
使用以下代码运行 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 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 行和waynodes
1,018,575 行。
你知道我该如何改进这个脚本吗?
顺便说一句,我从本教程中获得了这个脚本。
我没有索引,也没有执行计划。我只是按照教程进行操作,但出现内存不足错误。
我在 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 存储过程。
我试图代表这一点:
我的数据库设计是否正确?
我正在阅读本教程,对此我有疑问。
看这张图片:
'阅读'的逻辑关系我读到一个Project
必须有一个或多个Employee
。但是物理实现有一个项目可以有零个或多个ProjectEmployee
。
或者也许我错了,物理实现是正确的。
你怎么看?
我正在设计一个数据库,我想表示用户和组之间的关系:
一个用户可以在零个或多个组上。一个组可以有一个或多个用户。
我使用 Microsoft Visio 2013 绘制了此图:
是正确的?