在视图中将varchar转换为uniqueidentifier的SQL转换失败

5
我卡在了以下情况。我有一个带有客户数据的表格和一个记录我们B2B网站上发生事件的表格。
客户表如下:
ID,int,not null GUID,uniqueidentfier,not null,primary key 其他杂项...
监控表:
ID,int,not null USERGUID,uniqueidentifier,null PARAMETER2,varchar(50),null 其他杂项...
PARAMETER1存储客户guid以及其他数据类型。
现在的问题是按照最后访问日期对客户进行排序,最近访问的客户必须出现在网格的顶部。
我正在使用Entity Framework,并且我无法将字符串和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中测试查询时,我得到了以下错误消息:无法将字符型转换为唯一标示符。

问题出在以下片段(为了本问题而简化,但也会导致错误:

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 fiddle上创建一个示例,但该网站无法使用。 http://sqlfiddle.com/#!3/66d68/3

有没有人能指引我正确的方向?


SQL Server 的哪个版本? - Martin Smith
1个回答

11

使用

TRY_CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid

取代

 CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid

视图嵌入到查询中,CONVERT 可以在 WHERE 之前运行。

有关更多讨论,请参见SQL Server should not raise illogical errors


会尝试一下,但兼容性级别显然设置为 SQL Server 2005。我已经要求系统管理员更改它。 - CyclingFreak
1
@JurgenStillaert - 假设您的 dbo.isuniqueidentifier 函数正常工作,那么您可以使用 CASE WHEN dbo.isuniqueidentifier(parameter2) = 1 THEN CONVERT(UNIQUEIDENTIFIER, parameter2) END AS customerguid - Martin Smith
两种解决方案都可以。但是速度非常慢(获取10个客户需要40秒),所以我还有一些工作要做。 - CyclingFreak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接