2012-04-05 42 views
1

我只能用存储过程看到这个工作,我无法弄清楚语法。我基本上有一些外部系统调用SQL查询,我想验证表中存在第一个使用类似这样的代码:如何检查表是否存在并返回一个值(0/1),如果没有使用存储过程?

if (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'OrderUpdates')) 
    BEGIN 
    --return 1 or 0 if it exists or doesn't exist 
    END 

我不能让return语句才能正常工作。

+0

中列出的类型确定的正确值返回仅用于存储过程。 – 2012-04-05 21:54:25

+0

你的意思是退货还是选择? – 2012-04-05 22:04:49

+0

我的意思是我想要一列中有一行的结果集。不确定解释的正确措辞。 – 2012-04-06 17:39:55

回答

2
SELECT CAST(COUNT(*) AS BIT) -- Should be unique to give 0 or 1 as result 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'OrderUpdates' 
    -- Not sure if you want views or not: 
    AND TABLE_TYPE = 'BASE TABLE' 
+0

这正是我需要的! – 2012-04-06 15:42:26

1

我不明白你在做什么 - RETURN只在存储过程或函数中有效。

如果你想在一组同样的事情(因为调用者期待一个行集),那么这样的事情可以工作:

SELECT 1 AS DoesItExist 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'OrderUpdates' 
UNION ALL 
SELECT 0 
WHERE NOT EXISTS (SELECT * 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'OrderUpdates') 
+0

我把评论的回报,因为我不知道正确的词使用。我希望它能够返回一个值。 – 2012-04-06 15:43:02

+0

@Alex K Return可以从表值函数返回表,但通常只能返回一个值。选择各种东西的过程将返回结果集以及返回值(并且您也可以选择输出参数),但结果集并不是真正的返回值。听起来你不想使用存储过程,所以我不确定你要返回什么。我想这意味着你只能拥有产生客户端可以配置为解释的结果集的SQL(即一行中的一个值)。 – 2012-04-06 19:46:23

+0

是的,一个结果集就是我要去做的。我认为这也行得通 – 2012-04-06 20:53:05

0

SQL Server有一个名为“表”的表,其中包含数据库中的表的列表。所以,下面的代码应该有所帮助:

CREATE PROCEDURE DoesTableExist(@table VARCHAR(50), @exists BIT OUTPUT) 
AS 
BEGIN 
IF EXISTS(SELECT * FROM sys.tables WHERE name = @table) 
    SET @exists = 1 
ELSE 
    SET @exists = 0 

RETURN @exists 
END 
0

你可以做这样的事情:

USE SomeDatabase; 
IF OBJECT_ID('YourTable', 'U') IS NOT NULL 
BEGIN 
    SELECT 1 
END ELSE BEGIN 
    SELECT 0 
END 

如果你正在寻找比用户表以外的类型,你可以在OBJECT_ID改变“U”以sys.objects

+0

由于表格(或视图)以外的对象,这很容易导致误报。 – 2012-04-05 22:11:33

+0

@TimLehner你在编辑之间引起了我的注意。 :-)查看修订后的答案! – bhamby 2012-04-05 22:15:16

+0

我以前去过那里! – 2012-04-05 22:15:31

相关问题