小编gbn*_*gbn的帖子

如何使用sql server进行BEFORE UPDATED触发器?

我正在使用Sqlserver express而且我无法做before updated触发器.还有另外一种方法吗?

sql database sql-server triggers sql-server-express

41
推荐指数
4
解决办法
12万
查看次数

如何在截断字符串数据时回滚TSQL中的事务?

目前我有一个大的导入过程,我试图在事务中包装,所以如果有什么中断 - 我可以回滚.我遇到的问题是,当trans中的TSQL爆炸时,当发生以下SQL错误时它不会回滚

Msg 8152, Level 16, State 14, Line 249
String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

下面包装了这个导入TSQL

DECLARE @error INT
SELECT @error = 0
BEGIN TRANSACTION

--** begin import TSQL

--** end import TSQL

SELECT @error = @@error 
IF @error != 0 GOTO handle_error

COMMIT

handle_error: 
IF @error != 0 
BEGIN 
ROLLBACK 
END
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server error-handling

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

COUNT(*)总是返回结果吗?

如果我运行查询,例如:

SELECT COUNT(*) as num FROM table WHERE x = 'y'
Run Code Online (Sandbox Code Playgroud)

它是否总是返回结果,即使查询与任何记录都不匹配?或者我是否需要验证并确保返回一行作为结果?

mysql sql aggregate

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

在SQL Server数据库中存储GUID值的最有效方法

比如,如果我需要{AB50C41E-3814-4533-8F68-A691B4DA9043}在SQL Server数据库中存储非重复的GUID值(类似的东西),那么定义存储它的列的最有效方法是什么?(即作为字符串,blob,或将其转换为16字节整数.)

PS.该列必须定义为INDEX并且是UNIQUE.

t-sql sql-server guid

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

使用Replace()进行SELECT

我有一个名称和地址表,其中包括一个邮政编码列.我想从邮政编码中删除空格并选择与特定模式匹配的任何空格.我在SQL Server 2005上的T-SQL中尝试这个(简化了一下):

SELECT Replace(Postcode, ' ', '') AS P
FROM Contacts
WHERE P LIKE 'NW101%'
Run Code Online (Sandbox Code Playgroud)

但我得到以下错误;

Msg 207, Level 16, State 1, Line 3
Invalid column name 'P'.
Run Code Online (Sandbox Code Playgroud)

如果我删除WHERE子句,我会得到一个没有空格的邮政编码列表,这就是我想要搜索的内容.我该怎么做呢?我究竟做错了什么?

sql t-sql sql-server sql-server-2005

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

添加外键,SQL SERVER 2008

我试图将一个外键添加到表中,它给我以下错误:

引用表'tbl_Person'中没有主键或候选键与外键'P_ID'中的引用列列表匹配.

我有一个tbl_Person,定义为:

P_ID INT (Primary Key)
f_Name,
l_Name
Run Code Online (Sandbox Code Playgroud)

另一个表是一个注释表,定义如下:

C_ID INT,
Comments,
P_ID (should be the foreign key)
Run Code Online (Sandbox Code Playgroud)

尝试创建一对多关系表,因此当用户添加注释时,它会被引用给他,同时,他可以在不初始化新注释的情况下添加到注释中.希望这有点意义.

例如:Randy Bing输入"我喜欢SQL",他的ID是1,f_Name是Randy,l_Name是Bing,他的评论是"我喜欢Sql".他的评论应该存储一个唯一的ID,并导入他的P_ID.

稍后当Randy想要使用与P_ID匹配的相同C_ID添加注释而不创建新的C_ID.

这是代码:

ALTER TABLE tbl_Comments 
ADD CONSTRAINT P_ID
FOREIGN KEY (P_ID) 
REFERENCES tbl_Person(P_ID)
Run Code Online (Sandbox Code Playgroud)

我接近正确的轨道吗?

t-sql sql-server-2008

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

我如何'减去'sql表?

它不是我正在寻找的减法.我知道它不是一个联合或交集...我已经获得了一个冗长而复杂的存储过程,它返回一个活动和非活动文档的表.我也得到了一个类似的存储过程,它返回另一个只包含活动文档的表.

如何使用这两个存储过程获取非活动文档表?

我们正在使用SQL Server 2005.

sql t-sql sql-server sql-server-2005

26
推荐指数
4
解决办法
4万
查看次数

我真的需要使用"SET XACT_ABORT ON"吗?

如果你小心并且在所有内容周围使用TRY-CATCH,并且你真的需要使用以下错误回滚:

SET XACT_ABORT ON
Run Code Online (Sandbox Code Playgroud)

换句话说,是否有任何错误,TRY-CATCH将错过SET XACT_ABORT ON将处理?

sql-server error-handling transactions sql-server-2005

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

SQL Server:权限模式如何?

受到我见过的各种架构相关问题的启发......

如果存储过程和表都在同一模式中,则所有权链接允许我对存储过程进行GRANT EXECUTE,而不对我使用的表具有显式权限.

如果我们使用单独的模式,那么我必须在不同的模式表上显式GRANT XXX.所有权链接示例证明了这一点.这意味着存储的proc执行用户可以直接读/写表.

这就像直接访问类中的实例变量一样,绕过getter/setter,打破封装.

我们还使用行级安全性来限制某人看到的内容,并将其应用于存储过程.

那么,我们如何维护模式分离并防止直接表访问?

当然,如果您使用ORM或不使用存储过程,则该问题将不适用.但我不会问我是否应该使用ORM或存储过程,以防有人觉得需要启发我...

编辑,例如

CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO

CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO

CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO

CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC …
Run Code Online (Sandbox Code Playgroud)

permissions schema encapsulation sql-server-2005 sql-server-2008

25
推荐指数
3
解决办法
6万
查看次数

内部联接的SQL Server更新

我有3个表(简化):

 tblOrder(OrderId INT)  
  tblVariety(VarietyId INT,Stock INT)  
  tblOrderItem(OrderId,VarietyId,Quantity INT)
Run Code Online (Sandbox Code Playgroud)

如果我下订单,我会使用以下方式降低库存水平:

UPDATE tblVariety  
SET tblVariety.Stock = tblVariety.Stock - tblOrderItem.Quantity  
FROM tblVariety  
INNER JOIN tblOrderItem ON tblVariety.VarietyId = tblOrderItem.VarietyId  
INNER JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId  
WHERE tblOrder.OrderId = 1
Run Code Online (Sandbox Code Playgroud)

一切正常,直到tblOrderItem中有两行,同一个OrderId具有相同的VarietyId.在这种情况下,只有一行用于库存更新.似乎在某种程度上在那里做了一个GROUP BY VarietyId.

任何人都能解释一下吗?非常感谢.

sql t-sql join sql-server-2005

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