我是 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) 我有一个表作为这个例子:
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)
知道如何构建一个查询吗?
给定与 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 …
我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“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) 我有很多过程在创建它们时使用了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 ServerHASHBYTES()功能。
但我不知道如何取回传递给HASHBYTES...的值
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?
我正在尝试编写一个存储过程来确定两次之间的秒数差异。如果我要对我知道可以使用的值进行硬编码
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' 之间的秒数差异
我想使用 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) 当我运行查询时,我得到以下客户端统计结果:-
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 来跟踪它的运行情况,并且没有第二个查询
t-sql ×10
sql-server ×9
alter-table ×1
audit ×1
concat ×1
datetime ×1
ddl ×1
dynamic-sql ×1
hashing ×1
trigger ×1
update ×1