Dapper返回单值

时间:2016-06-07 10:49:33

标签: c# tsql dapper

我想执行这个简单的测试来查看表是否存在。我认为根据表是否存在而返回一个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语句不能在此上下文中使用。

这真的很点......

4 个答案:

答案 0 :(得分:5)

ExecuteScalar

  

执行查询,并返回查询返回的结果集中第一行的第一列。

它不返回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