我正在尝试创建一个存储过程,将记录从一个DB中的表插入另一个DB,使用每个表的完全限定名称,但是,由于这些表可以位于不同的DB中,因此DB名称需要能够根据字段的位置进行更改。我试图设置一个变量并使用该变量作为数据库名称,但是,SQL不允许这种方法。
请向我提供任何建议。
以下是我对此的查询:
DECLARE @FromPractice varchar(5) = 'MCE'
DECLARE @ToPractice varchar(5) = 'CRRLL'
DECLARE @FromEnvironment varchar(5)
DECLARE @ToEnvironment varchar(5)
SET @FromEnvironment = ( select environment from practice where practice = @FromPractice)
SET @ToEnvironment = ( select environment from practice where practice = @ToPractice)
PRINT @FromEnvironment
Print @ToEnvironment
INSERT INTO [@ToEnvironment].dbo.Patinfo
(
---Fields
)
SELECT
---Values
FROM [@FromEnvironment].dbo.PatInfo
where practice = @FromPractice
and pat_num = 25970
答案 0 :(得分:1)
以下是如何在动态sql中执行此操作的粗略示例。请注意,这很容易被sql注入。在此之前,您需要在流程中添加一些逻辑,以确保您的安全。鉴于其性质,最简单的方法是检查sys.databases中的环境变量。除非数据库名称非常短,否则您可能需要将这些变量保存为5个以上的字符。
declare @SQL nvarchar(max)
set @SQL = 'INSERT INTO [' + @ToEnvironment + '].dbo.Patinfo
(
--Fields
)
SELECT
--Values
FROM [' + @FromEnvironment + '].dbo.PatInfo
where practice = ''' + @FromPractice + '''
and pat_num = 25970'
--look before you execute
select @SQL
--When satisfied uncomment this
--exec sp_executesql @SQL