我在SQL Server 2005中有一个非常长时间运行的存储过程,我正在尝试调试,而我正在使用'print'命令来执行此操作.问题是,我只是在我的sproc的最后从SQL Server获取消息 - 我希望能够刷新消息缓冲区并在sproc的运行时立即看到这些消息,而不是在结束.
我有2个命令,需要它们都正确执行或者没有执行.所以我认为我需要一个交易,但我不知道如何正确使用它.
以下脚本有什么问题?
BEGIN TRANSACTION [Tran1]
INSERT INTO [Test].[dbo].[T1]
([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)
UPDATE [Test].[dbo].[T1]
SET [Title] = N'az2' ,[AVG] = 1
WHERE [dbo].[T1].[Title] = N'az'
COMMIT TRANSACTION [Tran1]
GO
Run Code Online (Sandbox Code Playgroud)
该INSERT命令已执行但UPDATE命令有问题.如果其中任何一个命令执行错误,我如何实现它来回滚这两个命令?
我写了一个类似这样的T-SQL语句(原始的一个看起来不同但我想在这里给出一个简单的例子):
SELECT first_name +
CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person
Run Code Online (Sandbox Code Playgroud)
此语句没有任何语法错误,但case子句始终选择ELSE部分 - 如果last_name为null也是如此.但为什么?
我想要做的是联合first_name和last_name,但如果last_name为null,则整个名称变为null:
SELECT first_name +
CASE last_name WHEN null THEN '' ELSE ' ' + last_name END AS Name
FROM dbo.person
Run Code Online (Sandbox Code Playgroud)
你知道问题出在哪里吗?
在检查Web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到某些语句以分号结束.
那么什么时候应该使用它?
declare @top int
set @top = 5
select top @top * from tablename
Run Code Online (Sandbox Code Playgroud)
可能吗?
或任何想法这样的逻辑(我不想使用动态查询)?
我有几个月在SQL Server中存储为1,2,3,4,... 12.我想将它们显示为1月,2月等.在SQL Server中是否有像MonthName(1)= January这样的函数?如果可能的话,我试图避免CASE声明.
在这个优秀的SO问题中,讨论了CTE和之间的sub-queries差异.
我想具体问一下:
在什么情况下,以下各项更有效/更快?
传统上,我temp tables在开发中使用了很多stored procedures- 因为它们看起来比许多交织在一起的子查询更具可读性.
Non-recursive CTEs非常好地封装数据集,并且非常易读,但是在某些情况下可以说它们总能表现得更好吗?或者是否必须总是摆弄不同的选项才能找到最有效的解决方案?
编辑
我最近被告知,就效率而言,临时表是一个很好的首选,因为它们具有相关的直方图即统计数据.
我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载.我对重建整个数据库不感兴趣 - 只需简单地"重新设置"数据.
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程,视图等?我不想为每个表手动创建和维护truncate table语句 - 我希望它是动态的.
如何从SQL Server的表中生成类?
我不是在谈论使用一些ORM.我只需要创建实体(简单类).就像是:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Run Code Online (Sandbox Code Playgroud)