在SQL Server中,如何验证查询是否返回NULL并根据它运行块。例如在查询1中,我想检查if count(*) is not null
,然后检查它是否有> 0。我应该在这里使用if exists
吗?
if select count(*) from tbl1 not is NULL then
if select count(*) from tbl1 where count(*)>0 then
raiserror()
end if
end if
在Oracle中,可以说IF INSERTING THEN
或IF updating THEN
或if deleting then
根据列运行某个代码块。我们如何在SQL Server中执行此操作?请参阅下面的Oracle代码。
CREATE OR REPLACE TRIGGER tr_name
BEFORE DELETE OR INSERT OR UPDATE OF column1 ON tbl1
FOR EACH ROW
WHEN (NEW.column1 IS NOT NULL)
begin
IF INSERTING THEN
run some code like check if there are more than row in a table and if >0 then not allow any inserts
IF updating THEN
run some code
IF deleting THEN
run some code
end
答案 0 :(得分:2)
DECLARE @ErrorMsg nvarchar(400)
IF (SELECT count(*) FROM tbl1) = 0
BEGIN
SET @ErrorMsg = 'You are returning nothing'
SELECT @ErrorMsg Err
RETURN
END
Else IF (SELECT count(*) FROM tbl1) >= 1
BEGIN
SET @ErrorMsg = 'You are returning something'
SELECT @ErrorMsg Err
RETURN
END
你不能从计数中得到空,所以如果你检查0实际上是等价的。
else if检查计数返回的任何内容
你也可以使用IF EXISTS
IF EXISTS (
SELECT 1 FROM tbl1
)
BEGIN
SET @ErrorMsg = 'You are returning something'
SELECT @ErrorMsg Err
RETURN
END
答案 1 :(得分:0)
如果您正在编写触发器,通常不会检查pseduo表中是否存在任何内容,您只需根据伪表编写代码。另请注意,oracle触发器逐行执行,SQL Server触发器调用一次,psuedo表中可能有多个mutliple记录。
所以你在触发器中做了类似的事情:
INSERT INTO AnotherTable (Col1,Col2) SELECT Col1,Col3 FROM INSERTED
INSERTED
是一个伪表。它包含插入(或更新)的所有记录。这里可能有0,1或许多记录。
如果记录为零,则此代码不会插入任何内容。
回到原来的问题,检查是否没有行的最佳方法是:
IF EXISTS (SELECT 1 FROM INSERTED)
BEGIN
-- Some Code
END
或者,在触发器中,您可以简单地指定触发器根本不会触发UPDATE或INSERT。
答案 2 :(得分:0)
select FOUND_ROWS();
将返回否。选择查询选择的记录。