2014-09-25 18 views
1

我在看一些SQL代码清理存储过程。在SQL中,可能有一个表示可以在存储过程中使用的数据库表的变量?

鉴于2个不同的数据库中有2个表格[DatabaseA].dbo.MyTable[DatabaseB].dbo.MyTable。是否有可能有一个变量代表这些位置,然后可以在存储过程中进一步使用?

要使用的位置由传递到存储过程的变量确定。类似下面的代码。

DECLARE @Location … 

If (@InputVariable = 1) 
BEGIN 
    @Location = [DatabaseA].dbo.MyTable 
END 
ELSE 
BEGIN 
    @Location = [DatabaseB].dbo.MyTable 
END 

BEGIN 
    UPDATE @Location 
    WHERE 
    … 
END 
+1

你必须使用动态SQL这个 – Raj 2014-09-25 09:01:28

回答

2

使用动态SQL这样

DECLARE @Location … 
DECLARE @SQL varchar(max) 
If (@InputVariable = 1) 
BEGIN 
     @Location = '[DatabaseA].dbo.MyTable' 
    END 
ELSE 
    BEGIN 
     @Location = '[DatabaseB].dbo.MyTable' 
    END 

BEGIN 
    SET @SQL = 
    'UPDATE '[email protected]+ 
    ' WHERE 
    … ' 
END 
EXECUTE (@SQL) 
+0

你可能将不得不把'[DatabaseA] .dbo.MyTable'成单引号,将其分配给'varchar(max)'变量.... – 2014-09-25 09:14:42

+0

谢谢。现在编辑。只是复制/粘贴OP的代码:) – Raj 2014-09-25 09:16:00

+0

是的,我注意到,只有*后*评论您的帖子.... – 2014-09-25 09:16:38

0
DECLARE @InputVariable INT = 2 


DECLARE @Sql NVARCHAR(MAX); 

SET @Sql = N' UPDATE ' + CASE WHEN @InputVariable = 1 THEN QUOTENAME('DatabaseA') 
           ELSE QUOTENAME('DatabaseB') END + '.[dbo].[MyTable] ' 
      + N' SET Column = SomeValue' 
      + N' WHERE some_condition' 

EXECUTE sp_executesql @Sql 
+0

在你的查询中,当你用** 2初始化** @ InputVariable **时,它总是会进入** DatabaseB ** ** – Rajesh 2014-09-25 09:31:16

+0

它仅用于演示目的 – 2014-09-25 10:17:04

相关问题