【发布时间】: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