如何在使用多个变量时使用变量"使用db"

时间:2014-06-05 20:45:50

标签: sql sql-server-2008

我有一个SQL脚本,我一直致力于提高灵活性。我需要它能够在一个DB中的表中插入行,然后创建一个表并在同一服务器上的另一个DB中插入行。我当然可以用两种不同的脚本来处理这些事情,但是我试图弄清楚如何在一个中完成所有这些。以下是我尝试过的一个例子:

    use firmTriad
create table #TempTable (IssueId nvarchar(300),[SQL] nvarchar(300),FirmID varchar(255),[Table] varchar(255),SecurityDelete varchar(255)
        ,SecurityKeep varchar(255))
declare @IssueID nvarchar(300),@SQL nvarchar(300),@FirmID varchar(255),@SecurityCUSIPdelete varchar(255),@SecurityCUSIPkeep varchar(255)
set @SecurityCUSIPkeep = 'AET133A20'
set @SecurityCUSIPdelete = 'AEXVA0559'
set @FirmID = 'firmTriad'
set @IssueID = 'RQST00002652426'
set @IssueID = 'tblSecurity_MSReference_' + @IssueID
insert into #TempTable (IssueId,FirmID,SecurityDelete,SecurityKeep)
select @IssueID,@FirmID,@SecurityCUSIPdelete,@SecurityCUSIPkeep

use PSBackup
select * from #TempTable
declare @Table varchar(255), @PSTable varchar(255)
set @PSTable = 'tblSecurity_MSReference_' + @IssueID
set @Table = @FirmID + '.dbo.' + left(@Table,len(@Table)-16)

print (@FirmID)
set @SQL = 'create table ' + @IssueID + '([RecID],[SecurityID],[MSCUSIP],[LastUpdateDT]
                ,Issue_Key,Issue_Backup_Date,Issue_Backup_Len)'
exec @SQL
insert into sys. (@firmID + '.dbo.tblSecurity_MSReference') --firmTriad.dbo.tblSecurity_MSReference
select [RecID],[SecurityID],[MSCUSIP],[LastUpdateDT],Issue_Key,Issue_Backup_Date,Issue_Backup_Len
from @Table 
where [SecurityID] in(select RecID from firmTriad.dbo.tblSecurity where CUSIP in(@SecurityCUSIPdelete,@SecurityCUSIPkeep))

我无法弄清楚如何让变量在两个use db部分之间延续。

1 个答案:

答案 0 :(得分:1)

我看到你正在创建一个物化临时表(#TempTable),然后做一些SELECT查询,然后创建一个新表并在那里插入一些数据。

据我所知,你的问题是跨数据库变量,对吧?

这有助于您了解这是有效的:

create table PSBackup.dbo.TheNameOfYourTable(
  IssueId nvarchar(300),
  [SQL] nvarchar(300),
  FirmID varchar(255),
  [Table] varchar(255),
  SecurityDelete varchar(255),
  SecurityKeep varchar(255)
);

您不需要使用PSBackup"为了创建一个表或基本上在该数据库中做任何事情。通用"公式"是:

SELECT * FROM <dbname>.<schemaname>.<tablename>
EXEC <dbname>.<schemaname>.<StoredProcedureName>

陈述&#34;使用PSBackup&#34;更改您正在使用的上下文。如果要创建表并且不提供dbname和schemaname,则SQL Server只使用默认值(master和dbo)。当然,如果更改上下文,则会丢弃变量。从transactions的角度思考,它将在白天变得清晰。

另一个不相关的事情是,你真的不应该为列名使用保留名称。这可能会在将来引发各种问题...尝试更改列名称:

  • &#34; [SQL]&#34;到&#34;查询&#34;
  • &#34; [表]&#34; to&#34; TBL&#34;或&#34; TableName&#34;

这有帮助吗?