我覺得這種方式爲b斯:
DECLARE
@Cnt int,
@SQL nvarchar(max),
@batch sysname,
@Identifier varchar(30)
-- set @batch and @Identifier
SET @SQL = 'SELECT @Cnt = Count(*) FROM ' + @batch
+ ' WHERE Identifier = @Identifier'
EXEC sp_executesql @SQL, N'@Cnt int OUT, @Identifier varchar(30)',
@Cnt OUT, @Identifier
IF @Cnt = 0 BEGIN
--do something
END
ELSE BEGIN
--do something else
END
但如果你只關心它是否是0或者沒有,那麼你應該這樣做,而不是,它可以只發現一個行後停止,而不必,指望他們所有:
DECLARE
@HasRows bit,
@SQL nvarchar(max),
@batch sysname,
@Identifier varchar(30)
-- set @batch and @Identifier
SET @SQL = 'SET @HasRows = CASE WHEN EXISTS (SELECT 1 FROM '
+ @batch + ' WHERE Identifier = @Identifier) THEN 1 ELSE 0 END'
EXEC sp_executesql @SQL, N'@HasRows bit OUT, @Identifier varchar(30)',
@HasRows OUT, @Identifier
IF @HasRows = 0 BEGIN
--do something
END
ELSE BEGIN
--do something else
END
但是,如果有任何方法可以避免使用動態SQL和更改表名,那最好。那麼這是一個簡單的查詢:
IF NOT EXISTS (SELECT 1 FROM TableName WHERE Identifier = @Identifier) BEGIN
-- do something
END
問題不明確。你想達到什麼目的?你想檢查批次中是否有行嗎?你是在聲明@Batch變量嗎,它是一個帶有表名稱的參數嗎? – 2010-01-28 06:18:03