2016-03-11 25 views
0

我对程序一无所知,但我必须创建一个,所以我尝试了一个。但现在我得到错误 - 请帮助。在存储过程中获取转换失败错误

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[Get_List_Docter_Detail_A] 
    @special varchar(MAX), 
    @city varchar(MAX), 
    @offset int, 
    @pageSet int, 
    @area varchar(MAX) 
AS 
Begin 
    declare @sql nvarchar(MAX); 

    set @sql = 'SELECT'+ 
     '(SELECT Stuff('+ 
      '(SELECT N"," + sp.specialization FROM DSpecialization_Master dsp'+ 
      'LEFT JOIN Specialization_Master sp on sp.id = dsp.specialization'+ 
      'WHERE dsp.profileid = pm.id and (dsp.specialization = (select id from Specialization_master where specialization='[email protected]+'))'+ 
      'FOR XML PATH(""),TYPE)'+ 
      '.value("text()[1]","nvarchar(max)"),1,1,N"")) as drspec,'+ 
    'pm.id as profileid,'+ 
    'pm.loginid as loginid,'+ 
    'dam.clinicname,'+ 
    'dam.area,'+ 
    'dam.address,'+ 
    'dam.pincode,'+ 
    'dam.id as addressid,'+ 
    'dam.feecharge as feecharge,'+ 
    'pm.fname,'+ 
    'pm.lname,'+ 
    'pm.email,'+ 
    'pm.mobile,'+ 
    'pm.phone,'+ 
    'pm.gender,'+ 
    'pm.dob,'+ 
    'pm.totexp,'+ 
    'pm.imagepath,'+ 
    'pm.languages,'+ 
    'pm.statement,'+ 
    'pm.createdby,'+ 
    'convert(nvarchar, pm.createdon, 103) as createddate,'+ 
    'convert(nvarchar, pm.createdon, 108) as createdtime,'+ 
    'pm.hsbit,'+ 
    'overall_count = COUNT(*) OVER(),'+ 
    '(SELECT Stuff('+ 
     '(SELECT N"," + education FROM DEducation_Master WHERE profileid = pm.id'+ 
     'FOR XML PATH(""),TYPE)'+ 
    '.value("text()[1]","nvarchar(max)"),1,1,N"")) as dredu'+ 
    'FROM Profile_Master pm '+ 
     'LEFT JOIN DAddress_Master dam on dam.profileid = pm.id '+ 
    'WHERE '+ 
     'dam.city='[email protected]; 
     if @area!='' 
      set @sql+=' and dam.area in('[email protected]+') and'; 
     set @sql+=' pm.id IN (SELECT profileid FROM DSpecialization_Master WHERE specialization = (select id from Specialization_master where specialization='[email protected]+')) ORDER BY dam.city OFFSET '[email protected]+' ROWS FETCH NEXT '[email protected]+' ROWS ONLY'; 

EXECUTE sp_executesql @sql 
END 

我得到这个错误。

消息245,级别16,状态1,过程Get_List_Docter_Detail_A,61线
转换转换时nvarchar的值“SELECT(选择的东西((SELECT N “” + sp.specialization FROM DSpecialization_Master dspLEFT失败JOIN Specialization_Master ()),sp.id = dsp.specializationWHERE dsp.profileid = pm.id和(dsp.specialization =(从Specialization_master中选择id,其中specialization = Dentist))FOR XML PATH(“”),TYPE).value(“text() [1]“,”nvarchar(max)“),1,1,N”“))作为drspec,pm.id作为profileid,pm.loginid作为loginid,dam.clinicname,dam.area,dam.address,dam .pincode,dam.id as addressid,dam.feecharge as feecharge,pm.fname,pm.lname,pm.email,pm.mobile,pm.phone,pm.gender,pm.dob,pm.totexp,pm.imagepath ,pm.languages,pm.statement,pm.createdby,convert(nvarchar,pm.crea tedon,103)as createddate,convert(nvarchar,pm.createdon,108)as createdtime,pm.hsbit,overall_count = COUNT(*)OVER(),(SELECT Stuff((SELECT N“,”+ education FROM DEducation_Master where profileid = pm.idFOR XML PATH(“”),TYPE).value(“text()[1]”,“nvarchar(max)”),1,1,N“”))as dreduFROM Profile_Master pm LEFT JOIN DAddress_Master dam在dam.profileid = pm.id WHILE dam.city =(suarat和dam.area在(Adajan))和'to data type int。

我在做什么错?请纠正我。

+0

你的动态SQL字符串错过件之间的间隙。例如,别名'dsp'后面没有空格,这将是一个'dspLEFT JOIN'字符串,这是一个错误。添加空格。顺便说一句,MSSQL允许多行字符串。 –

+0

城市变量没有引号。我建议回到静态SQL并写出你的条件,因为他们必须是。 '和(@area =''或dam.area = @area)'。如果你仍然想通过动态sql来做这件事,在执行它之前先放一个'print @ sql'。 –

+1

'... OFFSET'+ @ offset + ...'你的一边有一个巨大的字符串。另一方面是一个整数。你正试图把它们“加”在一起。 'int'具有比任何字符串类型更高的优先级,因此它试图将字符串转换为整数。您应该手动投射整数,但也可能有@Ivan已经指出的其他问题。 –

回答

0

尝试用双单配额来代替双配额

替换该行

'(SELECT N"," + sp.specialization 

随着

'(SELECT N'','' + sp.specialization