MSSQL: с учетом object_id таблицы определить, пусто ли - PullRequest
4 голосов
/ 17 февраля 2012

Для небольшого кода проверки работоспособности базы данных я бы хотел определить, соответствует ли конкретный object_id пустой таблице.

Есть ли какой-нибудь способ (например)select count(*) from magic_operator(my_object_id) или подобное?

Я бы настоятельно предпочел решение на основе чистого SQL, которое может работать на сервере MS SQL 2008b.

Ответы [ 2 ]

11 голосов
/ 17 февраля 2012

Вы можете получить приблизительное представление от

SELECT SUM(rows)
FROM sys.partitions p 
WHERE index_id < 2 and p.object_id=@my_object_id

Если вам нужна гарантированная точность, вам нужно создать и выполнить динамическую строку SQL, содержащую имя объекта из двух частей. Пример ниже, хотя в зависимости от того, как вы его используете, вы можете предпочесть использовать sp_executesql и вместо этого вернуть результат в качестве выходного параметра.

DECLARE @DynSQL nvarchar(max) = 
            N'SELECT CASE WHEN EXISTS(SELECT * FROM ' + 
            QUOTENAME(OBJECT_SCHEMA_NAME(@my_object_id)) + '.' + 
                   QUOTENAME(OBJECT_NAME(@my_object_id)) +
           ') THEN 0 ELSE 1 END AS IsEmpty'


EXECUTE (@DynSQL)
3 голосов
/ 17 февраля 2012

Ну, это зависит от того, что вы считаете Pure sql. Я пришел к следующему решению.Он написан исключительно на T-SQL, но использует динамически создаваемый запрос

-- Using variables just for better readability.
DECLARE @Name NVARCHAR(4000)
DECLARE @Schema NVARCHAR(4000)
DECLARE @Query NVARCHAR(4000)

-- Get the relevant data
SET @Schema = QUOTENAME(OBJECT_SCHEMA_NAME(613577224))
SET @Name = QUOTENAME(OBJECT_NAME(613577224))
-- Build query taking into consideration the schema and possible poor object naming
SET @Query = 'SELECT COUNT(*) FROM ' + @Schema + '.' + @Name + ''
-- execute it.
EXEC(@Query)

EDIT

Изменения учитывают возможные неисправные случаи, описанные в комментариях.

Я обрисовал в общих чертах переменные, потому что это удобный для меня подход.Приветствия.

...