sql—在查询之前添加数据库名称以传输数据

6qqygrtg  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(293)

在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)

但是我没有正确地替换源和目标数据库名称。
请帮忙。

lx0bsm1f

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)

ia2d9nvy

ia2d9nvy2#

这类代码似乎非常可疑。存储在不同数据库中的内容似乎应该存储在单个数据库中--可能存储在单个表中。
但有时这是必要的。
您需要动态sql。我建议:

DECLARE @SQL NVARCHAR(MAX);

SET @SQL = '
INSERT INTO @DestDB.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
    SELECT [DID], [LocalID], [Extension], [Content]
    FROM @SourceDB.[ABC104].[Document]
    WHERE [DID] = @SourceDID
';

SET @SQL = REPLACE(@SQL, '@DestDB', @DestDb);       -- might want quotename
SET @SQL = REPLACE(@SQL, '@SourceDB', @SourceDB);   -- might want quotename

EXEC sp_executesql @SQL,
                   'N@SourceDID NVARCHAR(255)',
                   @SourceDID=@SourceDID;

请注意,这将使用替换标识符 REPLACE() . 它分多个步骤来完成这项工作,因此很容易看到被替换的内容。
而且,这并不能取代 @SourceDID ,因为这只是参数化查询可以轻松处理的比较值。
我没有投进去 QUOTENAME() ,但在插入事物名称时,这是一种最佳做法,尤其是当数据来自不到100%安全的源时。

相关问题