【问题标题】:Getting Conversion failed error in stored procedure存储过程中出现转换失败错误
【发布时间】:2016-06-26 08:55:22
【问题描述】:

我对程序一无所知,但我必须创建一个,所以我尝试了一个。但现在我遇到了错误 - 请帮助。

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='+@special+'))'+
            '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='+@city;
        if @area!=''
            set @sql+=' and dam.area in('+@area+') and';
        set @sql+=' pm.id IN (SELECT profileid FROM DSpecialization_Master WHERE specialization = (select id from Specialization_master where specialization='+@special+')) ORDER BY dam.city OFFSET '+@offset+' ROWS FETCH NEXT '+@pageSet+' ROWS ONLY';

EXECUTE sp_executesql @sql
END

我收到此错误。

消息 245,级别 16,状态 1,过程 Get_List_Docter_Detail_A,第 61 行
转换 nvarchar 值时转换失败 'SELECT(SELECT Stuff((SELECT N"," + sp.specialization FROM DSpecialization_Master dspLEFT JOIN Specialization_Master sp on sp.id = dsp.specializationWHERE dsp.profileid = pm.id and (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 作为 addressid,dam.feecharge 作为 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. idFOR XML PATH(""),TYPE).value("text()[1]","nvarchar(max)"),1,1,N"")) as dreduFROM Profile_Master pm LEFT JOI N DAddress_Master dam on dam.profileid = pm.id WHERE dam.city=surat and dam.area in(Adajan) and' to data type int.

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

【问题讨论】:

  • 您的动态 sql 缺少字符串片段之间的空格。例如,别名 'dsp' 后面没有空格,这将是一个 dspLEFT JOIN 字符串,这是一个错误。添加空格。顺便说一句,MSSQL 允许多行字符串。
  • City 变量没有引号。我建议回到静态 sql 并写出你必须的条件。 and (@area = '' or dam.area = @area)。如果您仍想通过动态 sql 执行此操作,请在执行前添加 print @sql
  • ... OFFSET '+@offset+ ... 你的一侧有一根大绳子。另一边是一个整数。你正在尝试+他们在一起。 int 的优先级高于任何字符串类型,因此它试图将字符串转换为整数。您应该手动转换整数,但@Ivan 可能已经指出了其他问题。

标签: sql sql-server stored-procedures


【解决方案1】:

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

替换这一行

'(SELECT N"," + sp.specialization

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多