标签: t-sql

使用 CASE 按多列分组时出错

是否可以在 CASE 语句中按多个列进行分组?我收到错误“',' 附近的语法不正确。” 在下面的代码...

SELECT
  CASE 
     WHEN Type = 'Test'
       THEN Description
     ELSE MAX([Description])                
  END AS 'Description'
GROUP BY
CASE
    WHEN Type = 'Test'
        THEN Description
    ELSE ''
END,
Type, Account, Structure    
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql group-by

0
推荐指数
1
解决办法
4197
查看次数

将日期字符串转换为 SQL DATETIME - 希望没有 udf

我正在使用一个 Excel 文件,该文件具有不同格式的日期,但是当我尝试将其转换或将其转换为 SQL DATETIME 时,其中一种格式给我带来了一些痛苦。例如:

Thu Oct 16 13:40:19 2014Tue Apr 1 12:20:40 2014等等。

基本上格式是ddd MM dd HH:mm:ss yyyy.

我想知道是否有某种日期样式可以让我在一行中进行转换。我可以为此编写一个函数,但我想知道是否有更优雅的解决方案。我谷歌搜索没有运气。

t-sql sql-server-2008-r2 sql-server-2012 datetime

0
推荐指数
1
解决办法
693
查看次数

如何存储每个产品的版本序列

我需要创建一个如下所示的表:

+----+---------+---------+
| Id | Product | Version |
+----+---------+---------+
|  1 |       1 |       1 |
|  2 |       1 |       2 |
|  3 |       2 |       1 |
|  4 |       1 |       3 |
|  5 |       2 |       2 |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)

哪里IDIdentity(1,1)我需要的Version是自动填充这取决于插入Product

SELECT使用ROW_NUMBER()with可以达到类似的效果PARTITION

SELECT ID, Product,
ROW_NUMBER() OVER(PARTITION BY Product ORDER BY ID) AS Version
FROM Products
Run Code Online (Sandbox Code Playgroud)

我有哪些选择?

database-design sql-server t-sql identity ddl

0
推荐指数
1
解决办法
133
查看次数

如果不存在则更新语句

如果我有一个包含 2 列的简单表和一个由两列组成的复合主键,我该如何重命名其中一列,但前提是它不会导致主冲突?

这是一个简化的示例。

拿下表:

User  | Role
------|----------------
Joe   | User
Joe   | Administrator
Brian | User
Anna  | Administrator
Anna  | Admin
Run Code Online (Sandbox Code Playgroud)

假设我想编写以下查询:

UPDATE UserRoles Set Role = 'Admin' WHERE Role = 'Administrator'
Run Code Online (Sandbox Code Playgroud)

在不使用游标的情况下,如何更改 SQL 更新语句以避免重命名 Anna(因为该用户已经具有 Admin 角色),但仍重命名 Joe?

甚至可以使用基于集合的 SQL 还是使用游标是唯一的方法?

谢谢。

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

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

如何将此 varchar 转换为日期时间格式?

我有一个 varchar 列有像 (2015-12-02 20:40:37.8130000) 这样的数据,我已经从 csv 文件导入到 SQL 表。我需要将此列转换为数据时间 (2013-03-17 14:15:49.687)。

 ALTER TABLE track_date alter column start_time datetime.
Run Code Online (Sandbox Code Playgroud)

得到错误为:

从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。

使用 convert 函数进行转换时,得到相同的错误:

SELECT convert(datetime,start_time,5) from track_date 
Run Code Online (Sandbox Code Playgroud)

从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。

你能帮忙吗,如何将此 varchar 数据转换为日期时间格式?

sql-server t-sql type-conversion

0
推荐指数
2
解决办法
13万
查看次数

错误:未关闭的引号后

WHILE (@7DaysEarlierPartitionIntegerId <= @CurrentPartitionIntegerId)
    BEGIN
        Set @7DaysEarlierPartitionId 
            = CAST(@7DaysEarlierPartitionIntegerId AS char)
        set @sqlCommand 
            = 'Select * from ' 
              + quotename(@RequestUsage_Partition + @7DaysEarlierPartitionId)
              + 'where UserLogin like''r2\rohit.kharade'
        exec(@sqlCommand)
        set @7DaysEarlierPartitionIntegerId 
            = @7DaysEarlierPartitionIntegerId + 1
    END
Run Code Online (Sandbox Code Playgroud)

我收到错误:

字符串 'r2\rohit.kh' 后的非封闭引号。

如何执行 exec 命令 UserLogin =%r2\rohit.kharade%

sql-server t-sql

0
推荐指数
2
解决办法
916
查看次数

SQL 2005 未使用的过程

我正在尝试获取整个 SQL 服务器中未使用过程的列表。我已经完成了获取所有过程的列表,现在我正在使用以下脚本来确定使用了哪些过程。

DECLARE @command varchar(1000) 
SELECT @command = 

'USE [?] SELECT

qt.text AS "SP Name", 
qs.execution_count AS "Execution Count", 
qs.max_logical_reads, 
qs.max_logical_writes, 
qs.creation_time,
DB_NAME() as DatabaseName,
DATEDIFF(Minute, qs.creation_time, GetDate()) AS "Age in Cache"
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qt.text DESC'

EXEC sp_MSforeachdb @command 
Run Code Online (Sandbox Code Playgroud)

我知道这只会显示重启后使用过的程序。数据似乎有些作用 - 然而;我遇到的问题是它似乎显示了整个程序文本 IE:

CREATE PROCEDURE dbo.proc_MSS_PropagationGetQueryServers AS
DECLARE @Temp table(ServerID int, SearchServerName nvarchar(31), IndexDirectory nvarchar(260),
MachineStatus int, LastPropagationTime datetime,
PropagationStatus int ) INSERT INTO @Temp
SELECT SearchServerDirectory,
LastPropagationTime Index,LastPropagationMachineName 1 …

sql-server-2005 sql-server stored-procedures t-sql

0
推荐指数
1
解决办法
290
查看次数

T-SQL 或 PowerShell 将超过 2 天的 bak 文件移动到另一个位置

我使用的是 SQL Server 2005。我的一个备份驱动器已满,所以我想移动 2 天之前的备份。

我正在考虑创建一个每天运行的作业,但卡在了移动.bak文件的脚本上。

您知道从驱动器 A 移动文件并将其移动到共享位置的脚本吗?我的.bak文件没有时间戳。

sql-server-2005 sql-server powershell t-sql disk-space

0
推荐指数
1
解决办法
1331
查看次数

只查询返回匹配数据

我正在尝试使用左外连接从两个表中返回数据。MetaKnight 拥有最多的 storeNames,我希望所有这些都返回,当然还有来自 KnightNinja 的相应数据。我把下面的语法放在一起,但我的语法只返回两个表中符合条件的商店的名称。例如,应该返回 Store D 和 Store E,因为日期是 2017 年 1 月 - 但语法不会返回它。为什么?

这是示例垃圾 DDL 和查询

Create Table MetaKnight
(
    storeName varchar(500) NOT NULL
    ,storeNumber varchar(100) NOT NULL Primary Key
    ,openDate date NOT NULL
)

Create NonClustered Index snIndex
On MetaKnight (storeName ASC)

Create Table KnightNinja 
(
    storeName varchar(500) NOT NULL
    ,ssID varchar(100) NOT NULL Primary Key
    ,c1 int not null Default(0)
    ,c2 int not null Default(0)
    ,c3 int not null Default(0)
    ,c4 int not null Default(0) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

0
推荐指数
1
解决办法
65
查看次数

按父列排序的不同子行

我有一个查询,我想在其中检索不同的Child行,但按Parent. 如果我执行以下操作,则会收到错误消息,因为 中指定的列ORDER BY未包含在DISTINCT列表中:

SELECT
    DISTINCT c.foo, c.bar
    FROM Parent p
    JOIN Child c on c.parentId = p.id
    ORDER BY p.createdDate
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加p.createdDate到选择列表中,我将失去Child行的独特性,因为p.createdDate它们都不同。

如果我使用 CTE 或子查询首先进行排序,然后从中选择不同的行,则外部查询不保证它将保持内部/cte 查询的顺序。

有没有办法实现这一目标?

sql-server-2008 sql-server order-by t-sql distinct

0
推荐指数
1
解决办法
1767
查看次数