【问题标题】:Comparing string with an UNIQUEIDENTIFIER?将字符串与 UNIQUEIDENTIFIER 进行比较?
【发布时间】:2019-01-22 08:51:02
【问题描述】:

我写了如下程序:

ALTER PROCEDURE [dbo].[GetLocationOfGuidPre] 
    @GuidArgument UNIQUEIDENTIFIER
    .
    .
    .
    SET @SQL_String = 'INSERT INTO #Guids(FoundGuid) SELECT ' + @ColName + ' FROM ' + @TableSchema + '.' + @TableName + ' WHERE ' + @ColName + ' = ' + @GuidArgument;

当我尝试执行它时,我得到了这个错误:

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

如何将字符串值与UNIQUEIDENTIFIER 进行比较?

【问题讨论】:

  • 您需要使用 guid 文字 docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/…(上一节中的示例)。
  • 当您将动态 SQL 拼凑在一起时,将应用有关 SQL 注入的必要警告。即使所有输入都经过审查,也要注意标识符(如列名和表名)应使用QUOTENAME 进行转义,以防止您的代码因异常但合法的名称而中断。

标签: sql sql-server database sql-server-2012 dynamic-sql


【解决方案1】:

您是否尝试过将其作为参数传递?

SET @SQL_String = 'INSERT INTO #Guids(FoundGuid) SELECT ' + @ColName + ' FROM ' + @TableSchema + '.' + @TableName + ' WHERE ' + @ColName + ' = @GuidArgument';

EXEC sp_executesql @SQL_string,
                   N'@GuidArgument UNIQUEIDENTIFIER',
                   @GuidArgument = @GuidArgument;

【讨论】:

  • 试过了。这无济于事,因为错误是由于我设置 SQL_String 变量的行而被调用的。
  • @Chyu 。 . .注意这个 SQL 语句和你的不同。 @GuidArgument 未放入字符串中。它作为参数传递。
  • 就是那个!非常感谢,戈登!
【解决方案2】:

我想这个错误的原因很清楚:它说+ ' = ' + @GuidArgument; 不起作用,因为您尝试将唯一 ID 添加到 varchar... 只需尝试将您的 @GuidArgument作为 varchar 并且它应该工作。

【讨论】:

  • 如果您尝试将 UNIQUEIDENTIFIER 转换为 NVARCHAR,则只需要很少的第一个符号。
  • 嗯...奇怪:我刚刚在开发环境中尝试了以下操作,它返回了正确的 varchar 字符串:CAST(y AS VARCHAR(200)) GUID_Char(其中y 是我的 GUID 列......所以我猜“只有前几个迹象”根本不正确!
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多