标签: t-sql

创建存储过程并将日期手动添加到文件名

我是 SQL 管理的新手,负责创建一些夜间作业,这些作业发送一封电子邮件,其中包含电子表格中包含的某些详细信息,到目前为止,我有以下内容:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'support',
@recipients = 'test@mail.co.uk',
@subject = 'Post Code Analysis',
@query = N'SET ANSI_WARNINGS OFF;SET NO COUNT ON;select substring(PostOfficeBox,1,4) as ''Postcode''
, COUNT(CASE WHEN New_accounttype = 1 THEN New_AccountType ELSE NULL END) as ''New Connections''
, COUNT(CASE WHEN New_accounttype = 2 THEN New_AccountType ELSE NULL END) as ''Domestic Metered''
, COUNT(CASE WHEN New_accounttype = 3 THEN New_AccountType ELSE NULL END) as ''Commercial Metered Low''
, COUNT(CASE WHEN New_accounttype = 4 THEN New_AccountType ELSE NULL …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql concat

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

按发生率最高的值排序

我有一个表作为这个例子:

CREATE TABLE customerEvent(
    customerID  int NOT NULL,
    eventID     int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

customerID 可能出现在许多记录中。我使用以下查询来识别最常用的 customerID:

SELECT
    customerID,eventID
    ,row_number() OVER(PARTITION BY customerID ORDER BY eventID) as frequency
FROM customerEvent
ORDER BY frequency DESC
Run Code Online (Sandbox Code Playgroud)

有了这个我看到了那些最频繁的customerID。但它们仅在列表顶部出现一次。例子:

customerID  eventID frequency
7           3       5
15          9       4
7           1       4
9           4       3
7           10      3
15          2       3
Run Code Online (Sandbox Code Playgroud)

我需要最频繁的 customerID 的所有记录出现在顶部,例如:

customerID  eventID frequency
7           3       5
7           1       4
7           10      3
15          9       4
15          2       3
9           4       3
Run Code Online (Sandbox Code Playgroud)

知道如何构建一个查询吗?

sql-server t-sql sql-server-2012

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

确定 DDL 触发器中的命令类型/获取新列的名称和数据类型

给定与 DDL 命令对应的字符串,我如何确定它是哪个 DDL 命令(列添加、约束添加等)?

我在数据库上有一个 DDL 触发器,只要数据库中的任何表被更改,就会触发它;系统表将记录在数据库中的任何表上触发的 DDL 命令。

所以命令看起来像:

1. ALTER TABLE [dbo.table] ADD [column] VARCHAR(20) NULL;
2. ALTER TABLE [dbo.table] ADD [column] VARCHAR(20) NULL CONSTRAINT [cons] UNIQUE;
3. ALTER TABLE [dbo.table] WITH NOCHECK ADD CONSTRAINT [cons] CHECK ([column] > 1);
4. ALTER TABLE [dbo.table] WITH NOCHECK ADD [column1] VARCHAR(20) NULL,
   CONSTRAINT [cons] CHECK ([column] > 1);
Run Code Online (Sandbox Code Playgroud)

以上4条DDL语句有什么办法辨别吗?我只对将新列添加到表中的 DDL 感兴趣,并且希望仅检索此新列的名称和数据类型。

到目前为止,我一直在使用诸如SUBSTRING(), 之类的函数LEN()CHARINDEX()但运气不佳。

附言。我的触发器能够获取正在执行 DDL 的表的名称。

触发器将简单地将上述 4 个选项之一作为输入,并且需要区分何时发生了列更改,并且只检索新列名及其对应的数据类型。

在对表进行更改之后,触发器将被触发,这个确切的更改命令被记录在一个系统表中,作为我用来跟踪更改的 CDC 功能的一部分(限制我对命令的访问)。这个 CDC …

trigger sql-server audit t-sql ddl

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

如何添加/更新具有递增值的列并根据 SQL 中的另一列重置所述值

我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“X”),直到您将鼠标悬停在它们上面。我一遍又一遍地尝试重写搜索词,但我想我不知道该问什么,所以如果已经回答了这个问题,我深表歉意。

我试图弄清楚如何将一个 INT 列添加到一个表中,该列从 1 开始并根据另一个列值(我们称之为case_id)递增(我们称此字段版本),如果该值与先前迭代的行 - 如果它不相同,则版本值应重置为 1。

我试图通过更新我创建的临时表或在 SELECT INTO 语句期间添加值来解决这个问题。

此表的目的是存储案例的历史更新记录,由case_id列标识,此版本值与修改时间戳的顺序相同。

将此表结构视为源数据的示例:

---------------------------------
| case_id | modify_time         |
---------------------------------
| 1       | 2015-05-01 11:12:13 |
| 1       | 2015-05-02 12:13:14 |
| 1       | 2015-05-03 13:14:15 |
| 2       | 2015-05-01 11:12:13 |
| 2       | 2015-05-01 12:13:14 |
| 3       | 2015-05-02 11:12:13 |
---------------------------------
Run Code Online (Sandbox Code Playgroud)

将此作为我想要实现的最终结果的示例:

-------------------------------------------
| case_id | modify_time         | version |
-------------------------------------------
| 1       | …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql alter-table update temporary-tables

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

如何从过程代码中删除 WITH ENCRYPTION - 通过 T-SQL

我有很多过程在创建它们时使用了WITH ENCRYPTION选项。

您可以在下面的图片中看到这一点,例如:

在此处输入图片说明

问题是当我想保存我以前版本的存储过程时,我无法得到预期的结果,如下图所示。

在此处输入图片说明

我备份存储过程代码的方式在下面的链接上: 如何备份存储过程的当前代码及其权限?

select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
    , 'Type' = per.state_desc, 'Permission' = per.permission_name
    , 'Login' = pri.name, 'Type' = pri.type_desc 
    , *
From sys.procedures as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where ...
Run Code Online (Sandbox Code Playgroud)

有没有办法在保存之前从存储过程的代码中删除 WITH ENCRYPTION?

前提是我拥有​​该程序的所有权。

下面的链接上有一个几乎重复的问题 How to view an encrypted view or stored procedure

但是,在这个问题上,我拥有数据库。我是系统管理员。我可以使用任何资源,但我想要通过 T-SQL 的解决方案。

sql-server stored-procedures t-sql sql-server-2014

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

如何取回传递给 HASHBYTES() 的值?

我想使用 SQL ServerHASHBYTES()功能。

但我不知道如何取回传递给HASHBYTES...的值

sql-server t-sql hashing

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

执行从选择生成的动态 SQL

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

sql-server dynamic-sql t-sql sql-server-2012

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

寻找时间差异

我正在尝试编写一个存储过程来确定两次之间的秒数差异。如果我要对我知道可以使用的值进行硬编码

CAST(datediff(second, [start], [end])/3600.0 As Decimal(18,4)))
Run Code Online (Sandbox Code Playgroud)

但我只需要在满足条件的情况下才能获得差异。我的想法是做这样的事情

Declare @diff decimal(18,4)
Create Table #Dope
(
  date1 datetime
  ,inlate decimal(16,4)
)

INSERT INTO #Dope (date1) Values
('2016-01-04 08:08:47.000'),
('2016-01-04 08:25:59.000'),
('2016-01-04 08:27:47.000'),
('2016-01-04 08:00:00.000')

if CAST(date1 As Time) > '08:00:00.000'
--Here is where the capture would come but I am unsure of how to type it
SET @diff = CAST(datediff(second, [], [date1])/3600.0 As Decimal(18,4))
Run Code Online (Sandbox Code Playgroud)

如何将 Set 语句中的第一个日期时间设置为我需要秒差的当天上午 8 点?意思是,我不能只是将 '08:00:00.000' 硬编码到我的 Set 语句中,因为这两个日期我是不同的,这会给我跨越几天的秒数,这不是我所追求的。我只想看看 date1 和 '08:00:00.000' 之间的秒数差异

sql-server-2008 t-sql datetime

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

使用 Distinct 和 Sum?

我想使用 case 语句总结一些值。我的问题是编译器会抱怨,如果我没有在查询的末尾添加一个组,这会否定我的 Distinct,哈哈。例如,在我下面的示例中,red12即使 1 个条目不符合上述任何条件,这也会返回 2 个条目,但这让Group By我感到困惑!我怎样才能运行这个查询并只返回适用的结果,即case statements显示什么?

Create Table #Bobsled
(
  [event] varchar(100)
  ,[time] decimal(18,4)
  ,employeeID varchar(25)
  ,name varchar(500)
)

Insert Into #Bobsled Values
('Walk', '16.32','red12', 'red arrow')
,('Eat', '5.12', 'red12', 'red arrow')
,('Run', '32.13','pink01', 'pink pig')
,('Walk', '2.12', 'bl81', 'blue fire')
,('Sleep', '8.12', 'gr99', 'green pony')


Select Distinct
employeeid
,case when [event] = 'Walk' then SUM([time]) else 0 end as walktime
,case when [event] = 'RUN' then SUM([time]) else 0 …
Run Code Online (Sandbox Code Playgroud)

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

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

SQL Server 2012 客户端统计信息不正确

当我运行查询时,我得到以下客户端统计结果:-

Number of SELECT statements = 2
Run Code Online (Sandbox Code Playgroud)

正在运行的查询只有 1 个 SELECT 语句:-

SELECT TOP 1000000 * FROM [DATABASE].[SCHEMA].[TABLE]  
Run Code Online (Sandbox Code Playgroud)

我的客户端统计信息在服务器上返回,声称 2 个 SELECT 语句如下所示:-

在此处输入图片说明


在此处输入图片说明

有人可以解释为什么它会显示为 2 个 SELECT 语句吗?

我还使用 SQL Profiler 来跟踪它的运行情况,并且没有第二个查询

sql-server t-sql

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