在尝试实现将Pivot
两行数据表合并为一行的-ed 目标时,我的第一个想法是使用Cross Apply
. 通过使用Cross Apply
可以识别/生成具有从行的唯一 id 派生的特定列名的每一行。(例如,“纬度”源列的“纬度1”和“纬度2”)。
当我使用INT
orFLOAT
数据类型时一切都很好,但是当我尝试使用DateTime
all VALUES
become 时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');
Run Code Online (Sandbox Code Playgroud)
成功的交叉应用
如果我们CrossApply
对前三列的数据使用
SELECT col+cast([RouteID] as varchar(1)) new_col
, X.value
FROM #Shipping
CROSS APPLY
(
VALUES
(RouteID, …
Run Code Online (Sandbox Code Playgroud) 我知道关于这个问题还有其他问题,但这个问题真的很简单,所以我不是在寻找一个复杂的答案!
所以我有这个脚本:
IF EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'IDListTableType' AND ss.name = N'dbo')
DROP TYPE [dbo].[IDListTableType]
GO
IF NOT EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'IDListTableType' AND ss.name = N'dbo')
CREATE TYPE [dbo].[IDListTableType] AS TABLE(
[ID] [int] NOT NULL,
UNIQUE NONCLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
Run Code Online (Sandbox Code Playgroud)
运行它时出现错误,因为它IDListTableType
在数据库中的其他地方被引用。因此,我需要一种方法来更改表类型,或者查找并删除并重新创建所有其他引用IDListTableType
. 有没有一种简单的方法可以做到这一点?
我们正在创建一个新应用程序,其中使用各种表来保存枚举。由于这些表中的 ID 将用于按位比较,我们希望确保插入的新行将自动使用与“设置”的下一位相对应的十进制数。
例如,如果我们有一个闹钟应用程序,我们可能会包含一个“工作日”表,可以按以下方式使用:
CREATE TABLE dbo.Weekdays
(
WeekdayID INT NOT NULL
CONSTRAINT PK_Weekdays PRIMARY KEY CLUSTERED
, WeekdayName VARCHAR(20)
);
INSERT INTO dbo.Weekdays
VALUES (1, 'Sunday')
, (2, 'Monday')
, (4, 'Tuesday')
, (8, 'Wednesday')
, (16, 'Thursday')
, (32, 'Friday')
, (64, 'Saturday');
CREATE TABLE dbo.AlarmsDefined
(
AlarmID INT NOT NULL
CONSTRAINT PK_AlarmsDefined PRIMARY KEY CLUSTERED
, Weekdays INT NOT NULL
);
INSERT INTO dbo.AlarmsDefined (AlarmID, Weekdays)
VALUES (1, 50);
SELECT W.WeekdayName
FROM dbo.AlarmsDefined AD
INNER JOIN dbo.Weekdays …
Run Code Online (Sandbox Code Playgroud) SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?
这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。
在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。
由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
Run Code Online (Sandbox Code Playgroud)
结果
是否连接结果并调用Exec
?
授予用户查看所有模式中的所有存储过程的能力的方法是什么?
命令如
GRANT VIEW DEFINITION ON [dbo].[{SprocNameHere}] TO [{UserNameHere}]
Run Code Online (Sandbox Code Playgroud)
是一种一招小马,必须对所有存储过程进行操作。有没有更通用的方法来包含所有内容?
从其他位列计算位列的公式是什么?
例如:
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];
Run Code Online (Sandbox Code Playgroud)
IsOk
将根据,和的和-ing计算。HasValidHours
NoDemerits
NoAccidents
如何拥有一个允许消费者有选择地指定返回行数的存储过程?
如果未指定行数,则返回所有行。