我想执行这个简单的测试来查看表是否存在。我认为根据表是否存在而返回一个int值会很容易。
以下是我尝试过但不起作用的内容:
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 });
错误讯息:
带有返回值的RETURN语句不能在此上下文中使用。
这真的很点......
答案 0 :(得分:5)
执行查询,并返回查询返回的结果集中第一行的第一列。
它不返回SQL语句的返回值。你可以简单地使用
SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @tableSchema
AND TABLE_NAME = @tableName
然后您可以使用ExecuteScalar
,如果表存在,它将返回1
。请注意,我还更正了SQL语句中的参数。它们不能由'
分隔。
答案 1 :(得分:1)
您可以使用以下查询并检查结果是否大于零,而不是使用IF..ELSE语句。
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '@tableSchema' AND
TABLE_NAME = '@tableName'
BTW您的查询有语法错误,这就是您看到错误的原因。
答案 2 :(得分:0)
以上所有答案都是正确的,也是有道理的。但是您应该创建一个执行此检查的存储过程。这样,您将有更少的机会出现语法错误,并且更容易修复。
我建议该过程接受模式名称和表名作为参数。然后根据找到的表选择0或选择1。 Dapper可以执行程序,没有概率。
答案 3 :(得分: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