在sql server中,我计划将数据库名为“a”的4个表中的数据插入另一个数据库“b”。
我写了下面的查询:
DECLARE @SourceDB as NVARCHAR(255)='665DB33AS1'
DECLARE @DestDB as NVARCHAR(255)='755DB33Ab2'
DECLARE @SourceDID as NVARCHAR(255)='121sdfsdf1212sfw'
INSERT INTO @DestDB.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
SELECT [DID], [LocalID], [Extension], [Content]
FROM @SourceDB .[ABC104].[Document]
WHERE [DID] = =@SourceDID)
但是我没有正确地替换源和目标数据库名称。
请帮忙。
2条答案
按热度按时间lx0bsm1f1#
您可以通过使用
DYNAMIC SQL
```DECLARE @DestDB as NVARCHAR(255)='755DB33Ab2'
DECLARE @SourceDID as NVARCHAR(255)='121sdfsdf1212sfw'
DECLARE @SQL VARCHAR(MAX)
SET @SQL=CONCAT('INSERT INTO', @DestDB,'.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
SELECT [DID], [LocalID], [Extension], [Content] FROM',@SourceDB,' .[ABC104].[Document] WHERE [DID] = ',@SourceDID)
SELECT @SQL
EXEC (@SQL)
ia2d9nvy2#
这类代码似乎非常可疑。存储在不同数据库中的内容似乎应该存储在单个数据库中--可能存储在单个表中。
但有时这是必要的。
您需要动态sql。我建议:
请注意,这将使用替换标识符
REPLACE()
. 它分多个步骤来完成这项工作,因此很容易看到被替换的内容。而且,这并不能取代
@SourceDID
,因为这只是参数化查询可以轻松处理的比较值。我没有投进去
QUOTENAME()
,但在插入事物名称时,这是一种最佳做法,尤其是当数据来自不到100%安全的源时。