【问题标题】:Uniqueidentifier value insert dynamic in sql executionUniqueidentifier 值在 sql 执行中动态插入
【发布时间】:2019-08-26 19:53:06
【问题描述】:

我想在 SQL Server 的 Exec 调用中动态插入值。

DECLARE @TableName NVARCHAR(MAX) = 'tblTestInsert'
DECLARE @SQLString NVARCHAR(MAX)
DECLARE @Id UNIQUEIDENTIFIER = '3781EF06-6EE4-41ED-81C5-9AE7AD4C4356'

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName)
BEGIN
    SET @SQLString = 'INSERT INTO ' + @tableName + '(Id, FirstName, LastName, Description) VALUES ('+ CAST(@Id AS UNIQUEIDENTIFIER) + ',"visual","studio","visual studio 2017")';
    EXEC sp_executesql @SQLString
END
ELSE
BEGIN
   PRINT 'Table is not exists';
END

但它会引发以下错误:

数据类型 nvarchar(max) 和 uniqueidentifier 在加法运算符中不兼容。

请帮助解决这个问题。提前致谢!

【问题讨论】:

  • 可能你打算使用CAST(@Id AS NVARCHAR(MAX))
  • @AlwaysLearning 在使用 CAST(@Id AS NVARCHAR(MAX)) 后抛出类似“F06”附近的语法错误之类的错误
  • @debugger 确保用单引号将文字值括起来。
  • @EzLo 我尝试查询(基于您的查询),例如 SET SQLString = 'INSERT INTO ' + tableName + ' (Id,FirstName,LastName,Description)VALUES(CONVERT(UNIQUEIDENTIFIER,' + CONVERT(VARCHAR(100), Id) + '),"visual","studio","visual studio 2017")';错误抛出'F06'附近的语法不正确。
  • @EzLo 和 AlwaysLearning 感谢您的帮助。

标签: sql-server sql-server-2016


【解决方案1】:

您不能在没有转换的情况下将UNIQUEIDENTIFIERNVARCAHR 连接起来。

DECLARE @Id UNIQUEIDENTIFIER = '3781EF06-6EE4-41ED-81C5-9AE7AD4C4356'

SELECT
    N'This is the ID: ' + @Id

Msg 402,级别 16,状态 1,行 4 数据类型 nvarchar 和 uniqueidentifier 在 add 运算符中不兼容。

您希望将您的唯一标识符“重写”为 nvarchar,以便动态 SQL 正确地将其解释回来。请记住,唯一标识符不是像 nvarchar 这样的文本,它是一组 16 个字节。

DECLARE @Id UNIQUEIDENTIFIER = '3781EF06-6EE4-41ED-81C5-9AE7AD4C4356'

SELECT
    N'This is the ID: ' + CONVERT(NVARCHAR(100), @Id)

实际上我会在动态部分显式转换为 UID:

SET @SQLString = N'
    INSERT INTO ' + @tableName + N' (
        Id, 
        FirstName, 
        LastName, 
        Description) 
    SELECT 
        CONVERT(UNIQUEIDENTIFIER, ''' + CONVERT(NVARCHAR(100), @Id) + N'''),
        ''visual'',
        ''studio''
        ''visual studio 2017''';

【讨论】:

    【解决方案2】:

    不要使用文字字符串构建 SQL 语句,而是使用如下所示的参数化查询。此外,最好使用 ISO SQL 标准单引号,这样无论QUOTED_IDENTIFIER 会话设置如何,查询都会运行。使用双引号需要SET QUOTED_IDENTIFIER OFF,并且与 SQL Server 功能行索引视图、过滤索引等不兼容。人。

    DECLARE @TableName NVARCHAR(MAX) = 'tblTestInsert'
    DECLARE @SQLString NVARCHAR(MAX)
    DECLARE @Id UNIQUEIDENTIFIER = '3781EF06-6EE4-41ED-81C5-9AE7AD4C4356'
    
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName)
    BEGIN
        SET @SQLString = 'INSERT INTO ' + QUOTENAME(@TableName) + '(Id, FirstName, LastName, Description) VALUES (@Id,''visual'',''studio'',''visual studio 2017'');';
        EXEC sp_executesql @SQLString, N'@Id UNIQUEIDENTIFIER', @Id = @Id;
    END
    ELSE
    BEGIN
       PRINT 'Table does not exist';
    END;
    

    【讨论】:

    • 以上代码运行良好。谢谢你的支持。我还有一个疑问。如果在此查询中使用一个或多个唯一标识符列,我如何插入该值。你能解决这个疑问吗?
    • @debugger,您可以简单地指定具有不同名称的附加参数。例如,SET @SQLString = 'INSERT INTO ' + QUOTENAME(@TableName) + '(Id, FirstName, LastName, Description, Guid) VALUES (@Id,''visual'',''studio'',''visual studio 2017'', @Guid);'; EXEC sp_executesql @SQLString, N'@Id UNIQUEIDENTIFIER, @Guid UNIQUEIDENTIFIER', @Id = @Id, @Guid = @Guid;
    猜你喜欢
    • 2020-12-27
    • 2014-03-12
    • 2013-11-01
    • 1970-01-01
    • 2023-03-23
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多