SQL Server的一些隐藏功能是什么?
例如,未记录的系统存储过程,做一些非常有用但没有足够文档记录的技巧?
感谢所有人的所有伟大答案!
存储过程
片段
功能
杂项
GO
重复批次后的数字将问题的答案分解为"将一列拆分为多行",我在此重新编写为[1].
什么是(含义)Type = 'P'
以及为什么使用未记录的master..spt_values来拆分列?它有什么好处?
[1]
CREATE TABLE dbo.Table1
(
Col1 CHAR(1),
Col2 CHAR(1),
Col3 CHAR(1),
Col4 VARCHAR(50)
)
GO
INSERT INTO dbo.Table1 VALUES ('A','B','C','1,2,3')
GO
INSERT INTO dbo.Table1 VALUES ('D','E','F','6,7,8,9')
GO
SELECT
T.col1, RIGHT(LEFT(T.col4,Number-1),
CHARINDEX(',',REVERSE(LEFT(','+T.col4,Number-1))))
FROM
master..spt_values,
table1 T
WHERE
Type = 'P' AND Number BETWEEN 1 AND LEN(T.col4)+1 AND
(SUBSTRING(T.col4,Number,1) = ','
-- OR SUBSTRING(T.col4,Number,1) = '') --this does not work correctly anyway
Run Code Online (Sandbox Code Playgroud)
相关问题:
我正在尝试生成一个包含一系列日期时间的表.
我有指定的开始日期时间和结束日期时间(结束日期时间是序列结束),我添加一个时间间隔〜(这可能会有所不同)到开始日期时间(以秒为单位),这给了我结束日期时间.
下一个序列使用结束日期时间作为其起始值,并以秒为单位添加时间间隔.为了证明我需要的输出.有没有一种快速的方法来创建这样的表,除了使用大量插入命令?,我真的很难过
StartTime Endtime Duration
2011-07-20 11:00:33 2011-07-20 11:09:47 554
2011-07-20 11:09:47 2011-07-20 11:19:01 554
declare @StartTime datetime = '2011-07-20 11:00:33',
@EndTime datetime = '2011-07-20 15:37:34'
@Interval int = 554 -- this can be changed.
insert into tmp_IRange
values('2011-07-20 11:00:33', DATEADD(SECONDS, @Duration, 2011-07-20 11:00:33))
Run Code Online (Sandbox Code Playgroud)
这变得非常繁琐..尤其是当结束日期时间2011-07-20 15:37:34
有很多插入语句时:(
我有一个包含2列整数的表.第一列表示起始索引,第二列表示结束索引.
START END
1 8
9 13
14 20
20 25
30 42
42 49
60 67
Run Code Online (Sandbox Code Playgroud)
简单到目前为止.我想要做的是将所有记录组合在一起:
START END
1 25
30 49
60 67
Run Code Online (Sandbox Code Playgroud)
记录可以跟在上一个结束索引的相同索引处开始,或者以1的边距开始:
START END
1 10
10 20
Run Code Online (Sandbox Code Playgroud)
和
START END
1 10
11 20
Run Code Online (Sandbox Code Playgroud)
将导致
START END
1 20
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL Server 2008 R2.
任何帮助都会很棒
如果我有一个看起来像这样的表
begin date end date data
2013-01-01 2013-01-04 7
2013-01-05 2013-01-06 9
Run Code Online (Sandbox Code Playgroud)
如何让它像这样返回......
date data
2013-01-01 7
2013-01-02 7
2013-01-03 7
2013-01-04 7
2013-01-05 9
2013-01-06 9
Run Code Online (Sandbox Code Playgroud)
我想做的一件事就是让另一个表只包含所有日期,然后使用date>=begin date
和仅仅使用日期加入表中的表,date<=end date
但是这似乎有点笨拙,只需重复日期就可以保留额外的表.
在某些情况下,我没有数据范围,只是一个as of
日期基本上看起来像我的第一个例子,但没有end date
.该end date
由下一行的"作为"日暗示(即结束日期应该是下一行的as of
-1).我有一个"解决方案",它使用row_number()函数来获取下一个值但我怀疑这种方法,我正在做的方式有一堆嵌套的自联接,这导致非常长的查询时间.
我正在尝试运行一些报告,并且必须处理整个员工劳动时间跨越午夜的问题.虽然我可以将午夜时分的记录拆分成两条记录,好像雇员在午夜时钟退出并同时在午夜时钟回来,从而完全避开了午夜问题.
所以,如果我有:
EmployeeId InTime OutTime
--- ----------------------- -----------------------
1 2012-01-18 19:50:04.437 2012-01-19 03:30:02.433
Run Code Online (Sandbox Code Playgroud)
你认为如何分割这条记录是最优雅的方式:
EmployeeId InTime OutTime
--- ----------------------- -----------------------
1 2012-01-18 19:50:04.437 2012-01-19 00:00:00.000
1 2012-01-19 00:00:00.000 2012-01-19 03:30:02.433
Run Code Online (Sandbox Code Playgroud)
是的,我已经彻底考虑了这可能会对现有功能产生什么影响......这就是为什么我选择在不影响现有功能的临时表中执行此操作的原因.
作为一名C#开发人员,在尝试创建基于T-SQL的纯解决方案时遇到一系列日期范围涉及总结日/月的问题时,我正在摸不着头脑.
我有一组数据看起来像这样:
UserID Department StartDate EndDate
====== ========== ========== ==========
1 A 2011-01-02 2011-01-05
1 A 2011-01-20 2011-01-25
1 A 2011-02-25 2011-03-05
1 B 2011-01-21 2011-01-22
2 A 2011-01-01 2011-01-20
3 C 2011-01-01 2011-02-03
Run Code Online (Sandbox Code Playgroud)
日期范围不重叠,可能跨越几个月,特定用户和部门可能在一个月内存在多个范围.我想要做的是总结每个用户,部门,年和月的天数(包括),像这样(在我的例子中保留任何数学错误......):
UserID Department Year Month Days
====== ========== ==== ===== ====
1 A 2011 01 10
1 A 2011 02 4
1 A 2011 03 5
1 B 2011 01 2
2 A 2011 01 20
3 C 2011 01 31
3 C 2011 02 3 …
Run Code Online (Sandbox Code Playgroud) 我需要一些帮助SQL查询.我有一个列的值存储为逗号分隔值.
我需要编写一个查询,查找列中每个值中的第3个分隔项.
这可以在Select语句中执行此操作吗?例如:ColumnValue:josh,Reg01,False,a0-t0,22/09/2010
所以我需要False
从上面的字符串中获取第3个值(即).
我有以下声明:
insert into forecast_entry.user_role_xref
( user_master_id ,
role_id ,
created_date ,
created_by
)
values
( 276 , -- user_master_id - int
101 , -- role_id - int
getdate() , -- created_date - datetime
'MICHAELSK' -- created_by - varchar(20)
)
Run Code Online (Sandbox Code Playgroud)
我需要为role_id 101-355生成一行(所以上面的语句相同,除了使用role_id递增重复).最好的方法是什么?为了完成工作,我打算编写一个快速的C#应用程序,它将有一个循环,但我确信这不是最好的方法,并希望在这里学到一些东西,以避免将来这样做(因为我'我确定这种情况很常见).
我正在寻找一种计算BINARY(1024)字段的汉明权重/人口计数/“ 1位数”的快速方法。MySQL有一个类似的BIT_COUNT函数。我在T-SQL中找不到类似的功能?
还是建议将二进制数据存储在其他类型的字段中?
如果您不知道我在说什么,这是Wikipedia上有关海明重量的文章。
我需要创建一个从 1 到 n 的范围号。
例如,参数是@StartingValue
@StartingValue int = 96
Run Code Online (Sandbox Code Playgroud)
那么结果应该是:
Number
-------------
96
95
94
93
92
ff.
1
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
谢谢。
寻找一个查询或函数,对于给定的日期,它将返回接下来的 10 天(包括给定的日期作为参数)作为两列: - 日期 - 工作日名称
我正在使用 SQL Server 2019。
更新(@Dale K):我已经计算了日期和工作日,但这些是作为两个单独的查询和新行而不是多行
declare @mydate datetime
set @mydate = '2020-1-1'
select @mydate + 0, @mydate + 1, @mydate + 2, @mydate + 3, @mydate + 4, @mydate + 5, @mydate + 6
select
datename(dw, @mydate + 0),
datename(dw, @mydate + 1),
datename(dw, @mydate + 2),
datename(dw, @mydate + 3),
datename(dw, @mydate + 4),
datename(dw, @mydate + 5),
datename(dw, @mydate + 6)
Run Code Online (Sandbox Code Playgroud)