2016-06-07 4 views
3

Я хочу выполнить этот простой тест, чтобы увидеть, существует ли таблица. Я думал, что будет легко просто вернуть значение int в зависимости от того, существует ли таблица.Dapper return single value

Ниже то, что я пытался и не работает:

result = connection.ExecuteScalar<int>(@" 
IF (EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = '@tableSchema' 
       AND TABLE_NAME = '@tableName')) 
    RETURN 0; 


RETURN 1; 
", new { tableSchema, tableName }); 

Сообщение об ошибке:

ВОЗВРАЩЕНИЕ заявление с возвращаемым значением не может быть использована в этом контексте.

Это то, что на самом деле простак ...

ответ

4

ExecuteScalar

выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращаемого запросом.

Он не возвращает возвращаемое значение ваших операторов SQL. Вы могли бы просто использовать

SELECT 1 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = @tableSchema 
AND TABLE_NAME = @tableName 

Затем вы можете использовать ExecuteScalar и он будет возвращать 1 если таблица существует. Обратите внимание, что я также исправил ваши параметры в операторах SQL. Они не должны ограничиваться '.

+0

пятна на, отлично работает. –

1

Вместо того, чтобы использовать IF..ELSE заявление вы можете использовать следующий запрос и проверить, является ли результат больше нуля.

SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '@tableSchema' AND  
TABLE_NAME = '@tableName' 

У вашего запроса есть синтаксическая ошибка, поэтому вы видите эту ошибку.

0

Все ответы верны и имеют смысл. Но вы должны создать хранимую процедуру, которая выполняет эту проверку. Таким образом, у вас будет меньше шансов иметь синтаксические ошибки и облегчить их устранение.

Я рекомендую, чтобы процедура принимала имя схемы и имя таблицы в качестве параметров. Затем выберите 0 или выберите 1 в зависимости от найденной таблицы или нет. Dapper может выполнять процедуры, без проблем.

+0

Единственная проблема, эта программа - всего лишь тестовая консоль, чтобы убедиться, что компьютер, на котором он запущен, может видеть базу данных и указанную таблицу. Таким образом, база данных может быть любой, и может не иметь хранимой процедуры ... –

0

Как уже было сказано, вы получаете ошибку, потому что ваш SQL-запрос содержит ошибку. Попробуйте запустить его непосредственно в SQL, и вы получите такую ​​же ошибку. Если ваши значения показывают количество таблиц, которые вы возвращаете, то решение Karthik AMR кажется лучшим.

Если значения 1 и 0 на самом деле не подсчет, сколько таблиц существует, но может быть также некоторые символы, то это может также работать:

SELECT 
    CASE 
     WHEN EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'dbo' 
       AND TABLE_NAME = 'Users') THEN 'Y' 
     ELSE 'N' 
    END 
+0

Я запустил ее в sql, просто без возврата ... но я вижу, где две вещи одинаковы –