标签: sql-server-2014

SQL Server:使用带 ISOWK 参数的 DATEPART 将一周的第一天更改为星期日

我需要获取某些日期集的周数。例如,对于 2016 年 1 月,它应该类似于:

[Week Number]
53             <--- for dates from Jan 1 to Jan 2
1              <--- for dates from Jan 3 to Jan 9
2              <--- for dates from Jan 10 to Jan 16
...            <--- etc. 
Run Code Online (Sandbox Code Playgroud)

如您所见,一周应该从星期日开始。我使用以下函数来设置开始日期:

SET DATEFIRST 7
Run Code Online (Sandbox Code Playgroud)

这是获取周数的一个:

DATEPART(ISOWK, SOME_DATE)
Run Code Online (Sandbox Code Playgroud)

但我注意到这DATEFIRST不会影响ISOWK使用时的结果 - 周总是从星期一开始。

那么,我做错了什么?谢谢你!

更新:

我做了一个功能,看起来效果很好:

CREATE FUNCTION [dbo].[GetWeekNumber]
( 
    @date as DATETIME,
    @offset as INT
)
RETURNS NVARCHAR(100)
    BEGIN 
        DECLARE @weekNumber as int
        DECLARE @year as …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2014

3
推荐指数
1
解决办法
2830
查看次数

查询 date = '2016/01/02' 不起作用?

SQL FIDDLE 演示在这里

我有这样的表结构:

CREATE TABLE Department
(
     [IdDepartment] int, 
     [Name] varchar(23), 
     [IdUser] int, 
     [CreateDate] datetime
);

INSERT INTO Department ([IdDepartment], [Name], [IdUser], [CreateDate])
VALUES
    (1, 'Sales', 3, '2016-01-15 17:00:00.000'),
    (2, 'Finance', null, '2016-01-13 18:00:00.000' ),
    (3, 'Accounting' , 5, '2016-03-21 22:00:00.000'),
    (4, 'IT' ,3, '2016-03-21 17:00:00.000'),
    (5, 'Secretary',null, '2016-03-21 17:00:00.000'),
    (6, 'Sport',3, '2016-02-20 16:00:00.000');
Run Code Online (Sandbox Code Playgroud)

我想运行这个查询:

select Name 
from Department 
where CreateDate = '2016-03-21'
Run Code Online (Sandbox Code Playgroud)

结果返回 0 行。

我认为这是因为表结构中的日期是日期时间,但我尝试这样做,但两者都不适合我:

select Name 
from Department 
where CreateDate like '%2016-03-21%'
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

Name
-----
Accounting …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server datetime date sql-server-2014

3
推荐指数
1
解决办法
6771
查看次数

如何在 SQL Server 中查找数字序列中的间隙

我试图找到这个表中最小的缺失数字。

+------+--------+
| id   | number |
+------+--------+
|  902 |    1   |
|  908 |    2   |
| 1007 |    7   |
| 1189 |    8   |
| 1233 |   12   |
| 1757 |   15   |
+------+--------+
Run Code Online (Sandbox Code Playgroud)

在数字列中,您可以看到数字之间有几个间隙。我需要得到最小间隙之后的数字。所以在上面的例子中我需要数字 3。因为 2 是间隙后的最小数字。

sql sql-server sql-server-2014

3
推荐指数
1
解决办法
7806
查看次数

SQL 不存在包含空值

我有两个 SQL Server 表:

表格1

Id name   description     version
----------------------------------
1  Book1  Book 1 Title    v1
2  Book2  Book 2 Title    v2
3  Book3  Book 3 Title    NULL
4  Book5  Book 5 Title    v3
Run Code Online (Sandbox Code Playgroud)

表2

Id name   description     version
----------------------------------
1  Book1  Book 1 Title    v1
2  Book2  Book 2 Title    v2
3  Book3  Book 3 Title    NULL
4  Book4  Book 4 Title    NULL
5  Book5  Book 5 Title    NULL
Run Code Online (Sandbox Code Playgroud)

我想从表 2 中选择表 1 中不存在的所有数据,以便将它们插入到另一个表中。

这是 SQL 查询:

SELECT t2.name, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014

3
推荐指数
1
解决办法
1万
查看次数

有没有更好的方法来分割简单更新的工作?

我正在对表中的一行进行 MS SQL Server 更新,这非常简单。我正在用另外 4 件东西替换大约 4 件东西。

update Table set Column1 = 'something new' where Column1 = 'something old';
update Table set Column1 = 'something new 2' where Column1 = 'something old 2';
update Table set Column1 = 'something new 3' where Column1 = 'something old 3';
update Table set Column1 = 'something new 4' where Column1 = 'something old 4';
Run Code Online (Sandbox Code Playgroud)

这就是全部内容了。但我的问题是,这是一个在生产中运行的包含大量记录的表,但在运行更新之前确切的数量是未知的。有一个时间戳列。首先更新最新的可能更重要。

但我的问题可能是一个更实际的问题。

最好按时间戳对其进行分区并让它手动运行,还是有更好的方法让它运行?我还可以按每个更新语句来划分工作。

或者有什么方法可以将这样的东西放入脚本本身吗?

我尝试查看查询计划,但它没有告诉我拆分查询的最佳方法。

sql sql-server optimization query-optimization sql-server-2014

3
推荐指数
1
解决办法
990
查看次数

脚本任务使用集成服务版本不支持的 15.0 版本

我的团队计划从 SQL Server 2014 迁移到 2016。目前,SSIS 包是在 VS 2013 中创建的,并部署在 SQL Server 2014 上。为了测试,我尝试在 SSMS 17.3(集成服务 13.0)中部署该包。该包已成功部署,但当我尝试验证该包时,出现以下错误:

在此输入图像描述

在阅读了互联网上的一些解决方案后,我从以下路径部署了包:

%ProgramFiles%\Microsoft SQL Server\130\DTS\Binn
Run Code Online (Sandbox Code Playgroud)

包已成功验证(无需修改 ispac 文件)。据我了解,脚本任务是在 VS 2017 中使用 VSTA 主要版本 15 创建的。我尝试在 VS 2015 中打开解决方案,并使用 SQL Server 2017 作为目标服务器重建解决方案。在 SSMS 17.3 上部署包之前,我确保 dtsx 文件包含 15 个 VSTA 主要版本。

验证后,我在 SSMS 17.3 上部署了该包,它使用以下路径:

%ProgramFiles%\Microsoft SQL Server\140\DTS\Binn
Run Code Online (Sandbox Code Playgroud)

我验证了该包,但遇到了同样的错误。根据我的理解,如果我通过选择 SQL Server 2017 作为目标版本来构建解决方案,它应该能够成功验证。如果我想使用SSMS 17.3进行部署,如何解决这个问题?

sql-server ssis visual-studio sql-server-2014 sql-server-2016

3
推荐指数
1
解决办法
2万
查看次数

可以设置T-SQL变量的排序规则吗?

我到处搜索但找不到答案,你能设置变量的排序规则吗?根据MS 文档,似乎只能在 SQL Azure 上实现:

-- Azure SQL 数据仓库和并行数据仓库的语法
DECLARE
{{ @local_variable [AS] data_type } [ =value [ COLLATE ] ] } [,...n]

目前我必须这样做:

DECLARE @Test nvarchar(10) = N'Crud';

IF ( @Test = N'Crud' COLLATE Latin1_General_CS_AI )
    Print N'Crud';
IF ( @Test = N'cRud' COLLATE Latin1_General_CS_AI )
    Print N'cRud';
IF ( @Test = N'crUd' COLLATE Latin1_General_CS_AI )
    Print N'crUd';
IF ( @Test = N'cruD' COLLATE Latin1_General_CS_AI )
    Print N'cruD';
Run Code Online (Sandbox Code Playgroud)

当我想做的是这样的时候:

DECLARE @Test nvarchar(10) = N'Crud' COLLATE Latin1_General_CS_AI;

IF …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server sql-server-2014

3
推荐指数
1
解决办法
1229
查看次数

在存储过程中使用Begin tran,包括更新语句和CTE

我的存储过程结构如下所示,我收到一个错误

关键字'BEGIN'附近的语法不正确.

如果我删除BEGIN TRANCOMMIT TRAN语句然后存储过程运行正常.我不确定我做错了什么.任何人都可以帮助我理解什么是错的,什么应该是正确的方法?

Create PROCEDURE proc_name(param1,param2,param3)
AS
Begin
with cte(col1, col2, col3)
AS
(
Select col1
,col2
,col3
from table1
)
Begin Tran
Update table2
set col1 = 'text'
from table2 inner join cte on cte.hmy = table2.hmy
where some condition

update table3
set date = ''
from table3 inner join cte on cte.hmy = table3.hmy
where some different condition

COMMIT TRAN

END
Run Code Online (Sandbox Code Playgroud)

PS请忽略查询逻辑.我尝试通过删除业务逻辑来简化代码.

sql-server sql-server-2012 sql-server-2014

2
推荐指数
1
解决办法
2168
查看次数

将字符串转换为日期和时间

我有一个数据,其中日期和时间以yyyymmdd_time(20161012_1528)格式出现.

我想将它转换为SQL Server DB中的日期时间为2016-10-12 15:28:00:00

有没有直接的方法来做到这一点.还是要创建一个自定义函数?

sql t-sql sql-server datetime sql-server-2014

2
推荐指数
1
解决办法
119
查看次数

MS SQL通过查询循环为每个列名定义默认值

嘿所有我希望有人有一个脚本,有助于批量

说我有这样一张桌子:

CREATE TABLE [dbo].[Table_3](
    [value1] [varchar](50) NOT NULL,
    [value2] [varchar](50) NOT NULL,
    [value3] [varchar](50) NOT NULL,
    [value4] [nchar](10) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

而不是NOT NULL我想为值(又名'')输入一个空白.

现在我知道它可以这样做:

ALTER TABLE [dbo].[Table_3] ADD  CONSTRAINT [DF_Table_3_value1]  DEFAULT ('') FOR [value1]
GO
ALTER TABLE [dbo].[Table_3] ADD  CONSTRAINT [DF_Table_3_value2]  DEFAULT ('') FOR [value2]
GO
etc...
Run Code Online (Sandbox Code Playgroud)

但是我不想为每个列手动执行此操作,因为我的一些表有100多列.

是否有任何类型的查询将循环遍历我的所有列并将它们设置为我的默认值('')

sql sql-server ssms sql-server-2012 sql-server-2014

2
推荐指数
1
解决办法
126
查看次数