【发布时间】:2015-03-18 15:07:12
【问题描述】:
我正在使用动态 SQL 来执行查询。
为此我创建了这个存储过程:
CREATE PROCEDURE MySP
(
@StateId CHAR(3),
@DeptId VARCHAR(15),
@Query NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @Where NVARCHAR(500);
DECLARE @FinalQuery NVARCHAR(MAX)='';
SET @Where=' where emppersonal.stateid=Cast('''+@StateId+''' AS INT) AND emppersonal.deptid=LTRIM(RTRIM('''+@DeptId+'''))';
SET @FinalQuery = 'SELECT '+@Query+' '+@Where
EXEC(@FinalQuery)
END
我已经使用这些参数执行了该存储过程:
exec MySP '2','HPD0002',
'
emppersonal.empfname,
mdesigmast.designame AS CurrentDesignation,
ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'') AS appdate,
IDPT.deptname AS InitialJoinDept,
MO1.officeName,pisempprofessional.apporder, DSG.designame AS Designation,
mClassMaster.Name AS ClassName,
mpisrecruitmentmode.Name AS RecruitmentMode,
pisempprofessional.DesigName
FROM emppersonal
LEFT JOIN pisempprofessional ON emppersonal.stateid=pisempprofessional.stateid AND emppersonal.deptid=pisempprofessional.deptid And emppersonal.empcd=pisempprofessional.empcd
LEFT JOIN mdesigmast ON emppersonal.stateid=mdesigmast.stateid AND emppersonal.currdesig=mdesigmast.desigcode
LEFT JOIN mdeptmaster IDPT ON pisempprofessional.stateid=IDPT.stateID AND pisempprofessional.InitialJoiningdeptid=IDPT.deptid
LEFT JOIN mofficemaster MO1 ON pisempprofessional.stateid=MO1.stateid AND pisempprofessional.officeid=MO1.officeid
LEFT JOIN mdesigmast DSG ON pisempprofessional.StateID=DSG.StateID AND pisempprofessional.iphdesg=DSG.desigcode
LEFT JOIN mClassMaster ON pisempprofessional.iphclass=mClassMaster.ID
LEFT JOIN mpisrecruitmentmode ON pisempprofessional.modeofrec=mpisrecruitmentmode.id
'
当我执行那个过程时,我得到了这个错误:
消息 102,第 15 级,状态 1,第 19 行
'2' 附近的语法不正确。消息 105,第 15 级,状态 1,第 19 行
字符串'))'后面的非闭合引号。
如何解决以上错误?
谢谢
【问题讨论】:
-
将
ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'')更改为ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''') -
谢谢@wewestthemenace.. :)。您可以将其发布为答案..
-
您可以接受@Mackan 的回答,因为我们只是在说同样的话。
-
我只想补充一点,您在构造查询字符串时不必强制转换值...所以
SET @Where=' where emppersonal.stateid=Cast(''' + @StateId + ''' AS INT)...可以很容易地被SET @Where=' where emppersonal.stateid=' + @StateId + '...'替换,除非这个@StateId可以其他事情,而不仅仅是数字。我还建议将其类型从char(3)更改为varchar(3),这样数字就可以一直保持在需要的长度。
标签: sql-server sql-server-2008 dynamic-sql