0

可能重复:
有没有办法将表名指定为字符串?

以下脚本将无错误地执行:

DECLARE @SourceDB sysname, @SourceTable sysname, 
        @UserID NVARCHAR(500), @DMLType CHAR(1), @SourceIdent uniqueidentifier, @ChangedData XML,
        @SQL as NVARCHAR(MAX)

-- xml datatype and its capabilities rock
SELECT  @SourceDB = T.c.query('/AuditMsg/SourceDb').value('.[1]', 'sysname'),
        @SourceTable = T.c.query('/AuditMsg/SourceTable').value('.[1]', 'sysname'),
        @SourceIdent = T.c.query('/AuditMsg/SourceIdent').value('.[1]', 'uniqueidentifier'),
        @UserID = T.c.query('/AuditMsg/UserId').value('.[1]', 'NVARCHAR(50)'),
        @DMLType = T.c.query('/AuditMsg/DMLType').value('.[1]', 'CHAR(1)'),
        @ChangedData = T.c.query('*')
FROM    @msgBody.nodes('/AuditMsg/ChangedData') T(c)

INSERT INTO dbo.AVE_Stamm(SourceDB, SourceIdent, UserID, DMLType, ChangedData)
SELECT @SourceDB, @SourceIdent, @UserID, @DMLType, @ChangedData

但是当我将INSERT声明更改为

SET @sql = 'INSERT INTO @SourceTable (SELECT @SourceDB, @SourceIdent, @DMLType, @ChangedData, @UserID)';
EXEC (@sql);

它不再起作用了。有人可以帮我吗,这里有什么问题?

我在 SQL Server 2008 R2 的存储过程中使用此脚本。

4

3 回答 3

7

我认为您需要使用连接将参数值插入到字符串中:

SET @sql = 'INSERT INTO ' + @SourceTable + ' SELECT ....';
EXEC (@sql);

或使用sp_executesql

于 2012-10-25T15:37:31.910 回答
1
SET @SQL = 'INSERT INTO '+@SourceTable+' (VALUES '''+@SourceDB+''', '''+
    @SourceIdent+''', '''+@DMLType+''', '''+@ChangedData+''', '''+@UserID+''')';

将字符串传递到 EXECUTE 后,变量不再在范围内。您需要通过连接值来构建传入的字符串。此外,对于这种类型的 INSERT,VALUES 比 SELECT 更合适。

如果您的 XML 可能包含引号字符,则需要执行以下操作...

SET @SQL = 'INSERT INTO '+@SourceTable+' (VALUES '''+@SourceDB+''', '''+
    @SourceIdent+''', '''+@DMLType+''', '''+REPLACE(@ChangedData,'''','''''')+''', '''+@UserID+''')';
于 2012-10-25T15:57:23.940 回答
0

您的代码在我看来并不完整,但您应该使用sp_ExecuteSQL并定义语句的参数。有关 sp_ExecuteSQL 的详细信息,请参阅 MSDN。

于 2012-10-25T15:37:55.637 回答