3个表,2个DB,1个存储过程

时间:2014-07-21 17:25:01

标签: sql sql-server stored-procedures

对于SQL Server Management Studio中的存储过程,我是新手。我有一个应用程序,我被告知使用存储过程进行以下更改:

步骤1.用户键入项目编号。 第2步。客户名称,地址等显示在同一表单的其他字段中。

共有3个表:批量订单,小订单和客户信息。

批量订单和小订单在Database_1中,客户信息在Database_2中。

小订单的主键是订单号。小订单中的列包含每个订单的客户编号。该客户编号是客户表中的主键。 批量订单表类似。

我想要包含一个条件语句:如果在小订单表中找到订单号,则显示来自客户表的数据,该数据与该订单号相关联。我尝试了多种方法,但不断得到“多部分标识符....无法绑定”错误。

即:

SELECT DB1.db.Customer_Table.Customer_Column AS CustomerNumber;
    IF(CustomerNumber NOT LIKE '%[a-z]%')
    BEGIN
        SELECT * FROM db.small_orders_table;
    END

    ELSE
    BEGIN
        SELECT * FROM db.buld_orders_table;
    END

请帮忙。

2 个答案:

答案 0 :(得分:3)

听起来就像在同一台服务器上的2个数据库......在这种情况下,你需要在引用另一个表时指定完全限定的表名(database.schema.table)找到存储过程的数据库。

Database_1.db.small_orders_tables

答案 1 :(得分:0)

首先,您不能将别名用作变量。如果要为变量赋值以便对其进行测试,则必须执行类似SELECT @var = DB1.db.Customer_Table.Customer_Column FROM <YourTableFullName> WHERE <condition>的SELECT语句。然后你可以使用@var(必须在之前声明)进行测试。

关于您遇到的错误,您以错误的方式使用完全限定名称。如果您位于同一服务器(不同的数据库)上,则需要在顶部指定数据库名称,然后指定对象的架构。假设在Database1上有以下数据库对象:

USE Database1;
GO

CREATE TABLE dbo.Table1
(
      id int IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED
    , val varchar(30)
);
GO

INSERT INTO dbo.Table1 (val) VALUES ('test1');
GO
INSERT INTO dbo.Table1 (val) VALUES ('test2');
GO
INSERT INTO dbo.Table1 (val) VALUES ('test3');
GO

以及Database2上的以下内容:

USE Database2;
GO

CREATE TABLE dbo.Table2
(
      id int IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED
    , val varchar(30)
);
GO

现在,假设您想要使用id = 2从第一个表中读取值,然后应用IF。让我们声明一个变量并测试它:

USE Database1;
GO

DECLARE @var varchar(30);

-- since you're on Database1, you don't need to specify full name
SELECT @var = val FROM dbo.Table1 WHERE id = 2;

IF @var = 'test2'
BEGIN
    SELECT id, val FROM dbo.Table1;
END
ELSE
BEGIN
    -- in this case the database name is needed
    SELECT id, val FROM Database2.dbo.Table2;
END
GO

有帮助吗?