从varchar到uniqueidentifier的SQL转换在视图中失败

Cyc*_*eak 4 sql sql-server entity-framework sql-server-2012

我坚持以下情况.我有一个数据库,其中包含一个包含客户数据的表格和一个表格,我在其中放置记录以监控B2B网站上发生的情况.

客户表如下:

  • ID,int,not null
  • GUID,uniqueidentfier,not null,主键
  • 其他的东西...

监测表:

  • ID,int,not null
  • USERGUID,uniqueidentifier,null
  • PARAMETER2,varchar(50),null
  • 其他的东西...

PARAMETER1中包含客户指南以及存储的其他数据类型.

现在问题是根据他们上次访问日期订购我们的客户,最近访问过的客户必须排在网格顶部.

我正在使用实体框架,我遇到了比较字符串和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_%')
Run Code Online (Sandbox Code Playgroud)

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

问题在于以下代码段(针对此问题进行了简化,但也出现了错误:

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

FROM CM_CUSTOMER c
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM CM_CUSTOMER c
    LEFT JOIN
    [v_LastViewDateCustomer] v
on c.GUID = v.customerguid
Run Code Online (Sandbox Code Playgroud)

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

谁可以指出我正确的方向?

Mar*_*ith 8

使用

TRY_CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid
Run Code Online (Sandbox Code Playgroud)

代替

 CONVERT(UNIQUEIDENTIFIER, parameter2) AS customerguid
Run Code Online (Sandbox Code Playgroud)

视图内联到查询中,并且CONVERT可以在之前运行WHERE.

对于其他一些讨论,请参阅SQL Server不应引发不合逻辑的错误