在查看文档Universal Data Link (UDL) configuration (V2022/2019 & 2016) 时,它说我可以使用 UDL 文件通过下拉列表尝试Active Directory - Universal with MFA support:
类型登录(下面对话框中的第 2 节)。
但我在 Windows 10 VM 和我的 Windows 11 工作站上的版本没有此选项。我该怎么做才能获得选择权?
左边是(Windows 10/11 对话框)右边是文档视图。
在查看文档Universal Data Link (UDL) configuration (V2022/2019 & 2016) 时,它说我可以使用 UDL 文件通过下拉列表尝试Active Directory - Universal with MFA support:
类型登录(下面对话框中的第 2 节)。
但我在 Windows 10 VM 和我的 Windows 11 工作站上的版本没有此选项。我该怎么做才能获得选择权?
左边是(Windows 10/11 对话框)右边是文档视图。
我正在尝试加载一个表,其中包含基于另一个表随机生成的值。问题是 final 的结果集Cross Join
对于最终交叉连接表的每一行都不是唯一的(随机的)。
; with MinMax as -- Step one get the range of values for each `DetailCategoryId`
(
select distinct DetailCategoryId,
min(DetailId) over(partition by DetailCategoryId) as [Min]
, max(DetailId) over(partition by DetailCategoryId) as [Max]
from Ref.Detail
)
, RandProcess as -- Step two pick a random number between the range for each
(
select MM.DetailCategoryId
, (MM.[Min] + FLOOR(RAND() * (MM.[Max] + 1 - MM.[Min]))) as Rando
from MinMax MM
)
最后一步是创建一个交叉引用表,Cross JOIN
该表将为RandProcess
每个项目提供集合。.
select PRJ.ProjectId, RD.DetailCategoryId, RD.Rando
from info.Project PRJ
CROSS JOIN RandProcess RD
问题是表中的每组数据PRJ
都是相同的。这是每组PRJ
数据的前两行。
10000 101 7
10000 102 10
...
10001 101 7
10001 102 10
...
10002 101 7
10002 102 10
对于 PRJ 的每一行,如何使每个 PRJ 集都不同(随机)?
10000 101 7
10000 102 10
...
10001 101 4
10001 102 11
...
10002 101 1
10002 102 14
我的目标是将这些值作为每个PRJ
数据元素的测试值插入到另一个表中。
授予用户查看所有模式中所有存储过程的能力的方法是什么?
命令如
GRANT VIEW DEFINITION ON [dbo].[{SprocNameHere}] TO [{UserNameHere}]
是一招小马,必须在所有存储过程中完成。有没有更通用的方法来包含所有内容?
我最近在 AWS 中的 SQL Server 2019 (14.0.3192.2) 上编写了一个存储过程,该过程毫无问题地使用了该函数STRING_AGG
。当我将代码移至本地测试数据库时,它抱怨该方法。
经过研究,我开始将我的本地 sql server db 服务从 14.x 版本更新到最新的 15.0.2 并尝试再次安装 sproc;对失败
'"'',STRING_AGG(ActionDATE, ''","''),''"' 附近的语法不正确。
自 SQL Server 2017 以来,此功能一直是可行的……因此在 2019 的本地版本中缺失有点令人费解。
除了安装 SQL Server 2019 Developer Edition 来解决这个问题,我还有什么办法?
请注意,失败行STRING_AGG
是尝试创建一个 JSON 日期子数组,例如
[ '01/24/2020', '01/28/2020' ]
:
CREATE PROCEDURE [hcwfba].[GetOperationsAndActionDates]
@operationId int,
@locationId int
AS
WITH [DATA] AS (SELECT DISTINCT id_Operation, id_Location , CONVERT(varchar, ActionDATE ,101) AS [ActionDATE] FROM OperationDetail)
SELECT distinct
PD.id_Operation
, PD.id_Location
, JSON_QUERY((SELECT CONCAT(''["'',STRING_AGG(ActionDATE, ''","''),''"]'') FROM [DATA] DT2 WHERE DT2.id_Location = PD.id_Location)) As Dates
FROM [DATA] PD
WHERE PD.id_Operation = @operationId
AND PD.id_Location = @locationId
FOR JSON AUTO;
RETURN @@ROWCOUNT
[
{
"id_Operation": 13,
"id_Location": 8675309,
"Dates": [
"12/03/2018",
"08/27/2018",
"10/22/2018"
]
}
]
尝试使用Date
字段的计算列创建表时会生成此错误。
操作数类型冲突:int 与日期不兼容
如果我注释掉计算列,它就可以工作。
[DateInActive][Date] NULL, -- Date origination
[IsValid] AS (IsNull(DateInActive, 1)) -- Failure here
on 的想法IsValid
是简单地为该字段返回一个bit
on|off 以表示没有报告非活动日期,如果是,则它是有效的。
该列最终将For JSON
作为is-a
字段传递到输出中的 JSON,以供 SQL 外部使用。
完整的 SQL
CREATE TABLE [history].[PhoneBook](
[PhoneBookId] [int] IDENTITY(1,1) NOT NULL,
[PersonId] [int] NOT NULL,
[PhoneId] [int] NOT NULL,
[DateActive][Date] NOT NULL,
[DateInActive][Date] NULL,
[IsValid] AS (IsNull(DateInActive, 1))
CONSTRAINT [PK_PhoneBook_1] PRIMARY KEY CLUSTERED
(
[PersonId] ASC,
[PhoneId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
为什么这在 SQL Developer 中针对 Oracle 数据库会失败?实现相同目标的适当方法是什么?
DECLARE v_pNbr NUMBER := 100150;
begin
select * from TARGETTABLE where PROCESSNBR = v_pNbr;
end;
ORA-06550:第 3 行,第 2 列:PLS-00428:此 SELECT 语句中需要一个 INTO 子句
来自 SQL Server,我已经习惯了在 SSMS 查询编辑器/页面中创建变量,然后在多个选择中运行它们。因此,它允许人们通过更改一个而不是多个来理解操作。我看到的例子似乎暗示了历史终端的使用而不是编辑器,这可能会排除这种工作方式......因此,什么是可接受的使用 pl/sql 的方式。
如何让一个存储过程允许消费者有选择地指定返回的行数?
如果未指定行数,则返回所有行。
在尝试实现将Pivot
两行数据表变成一行的目标时,我的第一个想法是使用Cross Apply
. 通过使用Cross Apply
可以识别/生成具有从行的唯一 ID 派生的特定列名的每一行。(例如,“纬度”源列的“Lat1”和“Lat2”)。
INT
当我使用or数据类型时,一切都很好,FLOAT
但是当我尝试使用DateTime
all 时,一切都VALUES
变成了DateTime
。
航运纬度/经度/日期时间示例
在两个不同的日子里,我们在船上的旅程中有两个要点:
CREATE TABLE #Shipping
(
[RouteID] [INT] NOT NULL,
[Latitude] FLOAT NOT NULL,
[Longitude] FLOAT NOT NULL,
[Time] DATETIME NOT NULL
);
INSERT #Shipping(RouteID, [Latitude], [Longitude], [Time])
VALUES (1, 18.0221, -63.1206, '24-Jan-2016'),
(2, 17.8353, -62.99667, '25-Jan-2016');
成功交叉应用
如果我们使用CrossApply
前三列的数据
SELECT col+cast([RouteID] as varchar(1)) new_col
, X.value
FROM #Shipping
CROSS APPLY
(
VALUES
(RouteID, 'Id')
, (Latitude, 'Lat')
, (Longitude, 'Lon')
) X (value, col)
我们的结果符合预期:
伟大的!
与 DateTime 交叉应用失败
但是一旦我们添加DateTime
到组合中:
SELECT col+cast([RouteID] as varchar(1)) new_col
, X.value
FROM #Shipping
CROSS APPLY
(
VALUES
(RouteID, 'Id')
, (Latitude, 'Lat')
, (Longitude, 'Lon')
, ([Time], 'Time')
) X (value, col)
都变成DateTime
s
如果我的最终目标是将原始表中的所有值转换为一行,应该如何解决这个问题?
我的最终目标是比较两行(只存在两行)和特定类型,并确定其行值是否大于其他行类型值。我想出的结果似乎很笨拙,这让我想知道是否可以用更快或更优雅的方式完成。
我在这里创建了 sql fiddle来演示这个问题。
假设我们正在运送货物,我们的类型 1 的主要路线需要与其他路线类型 2 进行比较。每条路线都有一个 Wave 值和一个 Roll 值,需要独立比较。请注意,其他路线类型(除了 main,它始终使用)可以与Main
类型值 1 进行比较,但一次只能比较两个。
CREATE TABLE Shipping
(
[RouteID] [INT] NOT NULL,
[WaveValue] [INT] NOT NULL,
[RollValue] [INT] NOT NULL
);
INSERT Shipping(RouteID, WaveValue, RollValue)
VALUES (1, 20, 2), -- This is the main route
(2, 10, 30); -- The other secondary route, (only 2 items ever in this table)
根据表中当前的值,我们预计 MainsWave 将大于其他波浪,而 Roll 则相反。
这是工作的 sql,请注意,真正的最终结果只与IsMainWaveGreater
和有关,IsMainRollGreater
但所有列都显示用于调试:
SELECT Max1.RouteID
, Max1.WaveValue
, Max1.RollValue
, MaxOther.RouteID
, MaxOther.WaveValue
, MaxOther.RollValue
, IIF(Max1.RouteID = 1,
IIF(Max1.WaveValue > MaxOther.WaveValue, 1, 0),
IIF(Max1.WaveValue > MaxOther.WaveValue, 0, 1)) AS IsMainWaveGreater
, IIF(Max1.RouteID = 1,
IIF(Max1.RollValue > MaxOther.RollValue, 1, 0),
IIF(Max1.RollValue > MaxOther.RollValue, 0, 1)) AS IsMainRollGreater
FROM
Shipping AS Max1
INNER JOIN Shipping AS MaxOther ON Max1.RouteID > MaxOther.RouteID;
由于可以先读取并连接到下一行的行可能不是主路由(记住RouteID
main 中的值始终为1 ),因此 sql 必须有一个IIF
检查 Max1 是什么类型然后相应地交换检查/结果.
这可以优化甚至重写吗?
这只是 CTE 过程中的一个操作,因此可以进行其他操作。
我创建了一个参与CTE
的,没有递归,但是在处理需求的业务逻辑时进行了多项选择。不过,我被告知,没有返回行的场景所需的逻辑应该返回从中间CTE
的 select 之一找到的所有行,而不是返回最终操作。
如何实现?
请注意,以下示例是对我的流程的基本解释,并且在多个级联 CTE 选择基本上链接在一起之后发生了相关操作。
示例(在SQLFiddle上找到)
在用户表中有两条记录,其中UserId
s 的 id 是1
和2
。第一个CTE
s select,TargetUsers
将不返回需要第三个 CTEComputeWithUsers
来使用 the 的行AllUsers
。
WITH TargetUsers AS
(
SELECT *
FROM Users
WHERE UserId > 5
)
, AllUsers AS
(
SELECT * FROM Users
)
, ComputeWithUsers
(
-- This CTE will determine it needs to use `AllUsers` and not `TargetUsers`
)
或者有没有办法让TargetUsers
选择足够聪明,以便在其主要操作不返回任何行时提取所有用户?
SQL 中的业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从一个选择中执行多行生成的 sql,或者是否有一种从选择中调用存储过程的方法?
此步骤之前的流程是涉及到业务逻辑和数据驱动操作的操作,并且已经对相关的外键连接表进行了后续的插入操作。
在需要调用存储过程的那一刻,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及的过程,在存储过程中是有意义的,并且不能复制到现有过程中。
生成的代码的虚假示例Select
。
SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId) + ', '
+ Convert(varchar(6), @ROIResultId) + ', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + ', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + '; '
FROM @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId
结果
是否连接结果并调用Exec
?
以下工作代码针对 SQL-Server 2012,我已将实际问题提炼为可管理的场景,下面显示的代码示例也在SQL Fiddle.
我寻求有关使用 CTE 和临时表的最佳实践的反馈,并且想知道是否可以简化以下内容。
(请注意,这也在代码审查(插入差距记录报告流程)中被问到,到目前为止没有任何回应。)
存在两个表,其中包含代理和管理的时间戳事件。将在代理表上运行报告。但在代理表中,如果事件间隔超过 5 小时,则必须从事件管理表中为该间隔填写生成的报告。
代理人
CREATE TABLE AgentInteractions
(
[Event] VARCHAR(12) NOT NULL,
[Timestamp] [DateTime] NOT NULL
);
INSERT INTO dbo.AgentInteractions( Event, TimeStamp )
VALUES ( 'Alpha', '24-Jan-2018 3:04:00 PM' ),
( 'Beta', '24-Jan-2018 10:04:00 PM' ), -- Gap 7 hours
( 'Omega', '25-Jan-2018 2:04:00 AM' ); -- No Gap
管理
CREATE TABLE ManagementInteractions
(
[Event] VARCHAR(12) NOT NULL,
[Timestamp] [DateTime] NOT NULL
);
INSERT INTO dbo.ManagementInteractions( Event, TimeStamp )
VALUES ( '5pm', '24-Jan-2018 5:00:00 PM' ), -- Gap Filler #1
( '8pm', '24-Jan-2018 8:00:00 PM' ), -- Gap Filler #2
( 'Midnight', '25-Jan-2018 12:00:00 AM' ); -- Not used
使用以下将报告放入临时表的 sql,它计算行之间的时间差并设置原始数据中不存在的序列。
CTE 到临时表
IF OBJECT_ID('tempdb..#Actions') IS NOT NULL DROP TABLE #Actions;
WITH AgentActions AS
( SELECT ROW_NUMBER() OVER ( ORDER BY [Timestamp] ) AS [Sequence], -- Create an index number ordered by time.
Event ,
Timestamp
FROM AgentInteractions
)
SELECT CAST('Agent' AS VARCHAR(20)) AS [Origin] ,
AgentActions.Sequence ,
AgentActions.Event ,
( SELECT Other.Timestamp
FROM AgentActions Other
WHERE Other.Sequence = AgentActions.Sequence - 1
) AS Previous ,
AgentActions.Timestamp ,
ISNULL(DATEDIFF(HOUR,
( SELECT Other.Timestamp
FROM AgentActions Other
WHERE Other.Sequence = AgentActions.Sequence - 1),
AgentActions.Timestamp),
0) AS TimeFromLastPoint
INTO #Actions
FROM AgentActions;
select into 的结果#Actions
,注意 7 小时的差距:
以下 sql 确定差距,并插入管理表中的记录以填补差距。
将管理事件插入差距
WITH Gaps AS
( SELECT AC.Origin ,
AC.Sequence ,
AC.Event ,
AC.Previous ,
AC.Timestamp ,
AC.TimeFromLastPoint
FROM #Actions AC
WHERE AC.TimeFromLastPoint > 5
)
INSERT INTO #Actions ( [Origin] , [Event] , [Timestamp] , TimeFromLastPoint)
SELECT 'Management' ,
[Event] ,
[Timestamp] ,
0 -- We will figure this out after the insert.
FROM ManagementInteractions MAN
WHERE EXISTS ( SELECT *
FROM Gaps
WHERE MAN.Timestamp BETWEEN Gaps.Previous
AND Gaps.Timestamp );
SELECT Origin , Sequence , Event , Previous , Timestamp , TimeFromLastPoint
FROM #Actions ORDER BY Timestamp;
选择的结果。
最终报告执行步骤 1 中的操作,重新排序并确定所有点之间的持续时间。
CTE Deja-vu 最终报告
WITH Combined AS
(
SELECT Origin,
ROW_NUMBER() OVER ( ORDER BY [Timestamp] ) AS [Sequence], -- Create an index number ordered by time.
Event ,
Timestamp
FROM #Actions
)
SELECT Combined.Origin,
Combined.Sequence ,
Combined.Event ,
( SELECT Other.Timestamp
FROM Combined Other
WHERE Other.Sequence = Combined.Sequence - 1
) AS Previous ,
Combined.Timestamp ,
ISNULL(DATEDIFF(HOUR,
( SELECT Other.Timestamp
FROM Combined Other
WHERE Other.Sequence = Combined.Sequence
- 1
), Combined.Timestamp), 0) AS TimeFromLastPoint
FROM Combined;
这是结果
是否可以组合任何步骤,或者我应该使用或避免使用上述 sql 代码的任何做法?
从其他位列计算位列的公式是什么?
例如:
CREATE TABLE #Employee
(
[empNumb] [INT] identity(1,1) PRIMARY KEY,
[IsOk] [BIT] NOT NULL, -- This is computed from other three columns.
[HasValidHours] [BIT] NOT NULL,
[NoDemerits] [BIT] NOT NULL,
[NoAccidents] [BIT] NOT NULL
);
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_HasValidHours]
DEFAULT ((0)) FOR [HasValidHours];
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_NoDemerits]
DEFAULT ((0)) FOR [NoDemerits];
ALTER TABLE #Employee ADD CONSTRAINT [DF_Employee_NoAccidents]
DEFAULT ((0)) FOR [NoAccidents];
IsOk
将根据 ,和的and -ing计算。HasValidHours
NoDemerits
NoAccidents