Я думаю, что так лучше:
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