在我的存储过程中,我有三个插入语句.
在重复键值插入时,前两个查询会生成错误
违反PRIMARY KEY约束
和第三个查询像往常一样运行.
现在我想要,如果任何查询生成任何异常,一切都应该回滚.
如果任何查询都没有生成任何异常,则应该提交它.
declare @QuantitySelected as char
set @QuantitySelected = 2
declare @sqlHeader as varchar(1000)
declare @sqlTotals as varchar(1000)
declare @sqlLine as varchar(1000)
select @sqlHeader = 'Insert into tblKP_EstimateHeader '
select @sqlHeader = @sqlHeader + '(CompanyID,CompanyName,ProjectName,EstimateID,EstimateHeader,QuoteDate,ValidUntil,RFQNum,Revision,Contact,Status,NumConfigurations) '
select @sqlHeader = @sqlHeader + ' select CompanyID,CompanyName,ProjectName,EstimateID,EstimateHeader,QuoteDate,ValidUntil,RFQNum,Revision,Contact,Status,NumConfigurations '
select @sqlHeader = @sqlHeader + 'from V_EW_Estimate_Header where EstimateID = 2203'
select @sqlTotals = 'Insert into tblKP_Estimate_Configuration_Totals '
select @sqlTotals = @sqlTotals + '(ConfigRecId,RecId,SellQty,ConfigNum,ConfigDesc,SortOrder,OptionsInMainPrice,MarkupPctQty,'
select @sqlTotals = @sqlTotals + ' …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的表:
|UserId | ContactID | ContactName
---------------------------------------
| 12456 | Ax759 | Joe Smith
| 12456 | Ax760 | Mary Smith
| 12458 | Ax739 | Carl Lewis
| 12460 | Ax759 | Chuck Norris
| 12460 | Bx759 | Bruce Lee
Run Code Online (Sandbox Code Playgroud)
我需要为此表添加一个约束,以便没有用户可以拥有重复的联系人ID.用户正在从各种外部系统导入数据,因此ContactId不是全面唯一的,但在每个用户的基础上是唯一的.
我知道如何基于单列创建唯一和非空的约束,但是如何在2列中创建唯一的约束?
sql-server sql-server-2005 constraints unique-constraint sql-server-2008
我有一个Emp包含这些行的表:
Emp_cd | Val1 | Val2 | Val3 | Total
-------+-------+-------+-------+-------
1 | 1.23 | 2.23 | 3.43 |
2 | 23.03 | 12.23 | 2.92 |
3 | 7.23 | 9.05 | 13.43 |
4 | 03.21 | 78.23 | 9.43 |
Run Code Online (Sandbox Code Playgroud)
我想找到SUM的Val1, Val2, Val3,并且将在显示Total列.
可以在事务中使用SQL"truncate table"命令吗?我正在创建一个应用程序,我的表有大量的记录.我想删除所有记录,但如果应用程序失败,我将回滚我的事务.删除每条记录需要很长时间.我想知道我是否使用截断表,我是否仍然可以回滚事务并在发生故障时恢复数据.我意识到truncate table不会将每个删除写入事务日志,但我想知道它是否将页面释放写入日志以便回滚工作.
我一直在研究在一系列程序上改进性能,最近一位同事提到他在使用INNER JOIN代替EXISTS时已经取得了显着的性能提升.
作为调查的一部分,为什么这可能是我想我会问这里的问题.
所以:
实际上,人们可以对这个问题提出任何其他经验.
如果有任何答案可以在没有任何其他可能的性能改进建议的情况下专门解决这个问 我们已经取得了相当程度的成功,我只对这一项感兴趣.
任何帮助将非常感激.
我的C#客户端将批量数据插入SQL Server 2005数据库时遇到了一些性能瓶颈,我正在寻找加快这一过程的方法.
我已经在使用SqlClient.SqlBulkCopy(它基于TDS)来加速通过线路的数据传输,这有很大帮助,但我仍然在寻找更多.
我有一个简单的表,看起来像这样:
CREATE TABLE [BulkData](
[ContainerId] [int] NOT NULL,
[BinId] [smallint] NOT NULL,
[Sequence] [smallint] NOT NULL,
[ItemId] [int] NOT NULL,
[Left] [smallint] NOT NULL,
[Top] [smallint] NOT NULL,
[Right] [smallint] NOT NULL,
[Bottom] [smallint] NOT NULL,
CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED
(
[ContainerIdId] ASC,
[BinId] ASC,
[Sequence] ASC
))
Run Code Online (Sandbox Code Playgroud)
我在平均大约300行的块中插入数据,其中ContainerId和BinId在每个块中是常量,并且Sequence值是0-n,并且值是基于主键预排序的.
%Disk时间性能计数器花费大量时间在100%,因此很明显磁盘IO是主要问题,但我得到的速度比原始文件副本低几个数量级.
如果我:它有帮助吗?
- 根据我得到的答复,让我澄清一下:
Portman:我正在使用聚簇索引,因为当数据全部导入时,我需要按顺序依次访问数据.导入数据时,我并不特别需要索引.在执行插入时是否有任何优势来使用非聚簇PK索引而不是完全删除约束以进行导入?
Chopeen:数据是在许多其他机器上远程生成的(我的SQL服务器目前只能处理大约10个,但我希望能够添加更多).在本地计算机上运行整个过程是不切实际的,因为它必须处理50倍的输入数据才能生成输出.
Jason:我在导入过程中没有对表进行任何并发查询,我会尝试删除主键,看看是否有帮助.
我有一个用户'dbo'的数据库,其登录名为"domain\xzy".如何将其从"domain\xzy"更改为"domain\abc".
我有这样一张桌子:
rowInt Value
2 23
3 45
17 10
9 0
....
Run Code Online (Sandbox Code Playgroud)
列rowInt值是整数,但不是具有相同增量的序列.我可以使用以下sql按rowInt列出值:
SELECT * FROM myTable ORDER BY rowInt;
Run Code Online (Sandbox Code Playgroud)
这将按rowInt列出值.如何获得两行之间的Value的差异,结果如下:
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
Run Code Online (Sandbox Code Playgroud)
该表在SQL 2005(Miscrosoft)中
使用Sql Server 2005 Profiler,您可以跟踪哪些事件,列和过滤器以查找最慢的查询和存储过程?
慢=大于N秒,为了争论10.
MS Access有一个按钮,用于生成用于查找重复行的sql代码.我不知道SQL Server 2005/2008 Managment Studio是否有此功能.
如果有,请指出哪里
如果还没有,请告诉我如何创建一个T-SQL帮助器来创建这样的代码.
sql-server-2005 ×10
sql-server ×9
sql ×6
t-sql ×3
c# ×1
constraints ×1
performance ×1
profiling ×1
security ×1
ssms ×1
transactions ×1
truncate ×1