【问题标题】:SQL conversion from varchar to uniqueidentifier fails in view从 varchar 到 uniqueidentifier 的 SQL 转换在视图中失败
【发布时间】:2013-12-26 18:20:17
【问题描述】:

我陷入了以下情况。 我有一个数据库,其中包含一个包含客户数据的表和一个用于监控 B2B 网站上正在发生的事情的记录的表。

客户表如下:

  • ID,整数,不为空
  • GUID,唯一标识符,非空,主键
  • 其他东西...

监控表:

  • ID,整数,不为空
  • USERGUID,唯一标识符,空
  • PARAMETER2,varchar(50),空
  • 其他东西...

在 PARAMETER1 中是客户 guid 以及存储的其他数据类型。

现在问题来了,根据客户的上次访问日期对我们的客户进行排序,最近访问的客户必须排在网格的顶部。

我正在使用实体框架,但在比较字符串和 guid 类型时遇到了问题,所以我决定在我的监控表上创建一个视图:

SELECT        
   ID, 
   CONVERT(uniqueidentifier, parameter2) AS customerguid, 
   USERguid, 
   CreationDate
FROM            
   MONITORING
WHERE        
   (dbo.isuniqueidentifier(parameter2) = 1) 
   AND 
   (parameter1 LIKE 'Customers_%' OR parameter1 LIKE 'Customer_%')

我在 EF 中导入了视图并进行了 Linq 查询。它什么也没返回,所以我提取了生成的 SQL 查询。在 SQL Management Studio 中测试查询时,出现以下错误: 从字符串转换为唯一标识符时转换失败。

问题出在下面sn-p(为这个问题简化了,但也报错:

SELECT *,
    (
        SELECT 
            [v_LastViewDateCustomer].[customerguid] AS [customerguid]
        FROM [dbo].[v_LastViewDateCustomer] AS [v_LastViewDateCustomer]
        WHERE c.GUID = [v_LastViewDateCustomer].[customerguid]
    )

FROM CM_CUSTOMER c

但是当我加入时,我会得到我的结果:

SELECT *
FROM CM_CUSTOMER c
    LEFT JOIN
    [v_LastViewDateCustomer] v
on c.GUID = v.customerguid

我试图制作一个 SQL 小提琴,但它正在那个网站上工作。 http://sqlfiddle.com/#!3/66d68/3

谁能指出我正确的方向?

【问题讨论】:

  • 什么版本的 SQL Server?

标签: sql sql-server entity-framework sql-server-2012


【解决方案1】:

使用

TRY_CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid

而不是

 CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid

视图被内联到查询中,CONVERT 可以在 WHERE 之前运行。

更多讨论见SQL Server should not raise illogical errors

【讨论】:

  • 会尝试,但兼容性级别显然设置为 SQL Server 2005。我已经要求系统管理员更改它。
  • @JurgenStillaert - 假设您的 dbo.isuniqueidentifier 函数正常工作,那么您可以改为使用 CASE WHEN dbo.isuniqueidentifier(parameter2) = 1 THEN CONVERT(UNIQUEIDENTIFIER, parameter2) END AS customerguid
  • 两种解决方案都有效。但是速度很慢(40 秒才能吸引 10 个客户),所以我还有一些工作要做。
猜你喜欢
  • 2010-11-26
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2016-06-27
  • 1970-01-01
  • 2014-05-07
相关资源
最近更新 更多