执行动态 SQL
Execute Dynamic SQL
我正在使用动态 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
'
当我执行那个过程时,我得到这个错误:
Msg 102, Level 15, State 1, Line 19
Incorrect syntax near '2'.
Msg 105, Level 15, State 1, Line 19
Unclosed quotation mark after the character string '))'.
如何解决上述错误?
谢谢
和其他地方一样,需要使用双撇号:
ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''')
应该就可以了
The apostrophe, or single quote, is a special character in SQL that specifies the beginning and end of string data. This means that to use it as part of your literal string data you need to escape the special character. With a single quote this is typically accomplished by doubling your quote.
喜欢@Mackan提到
The apostrophe, or single quote, is a special character in SQL that
specifies the beginning and end of string data. This means that to use
it as part of your literal string data you need to escape the special
character. With a single quote this is typically accomplished by
doubling your quote.
因此将您的 Param
从
更改为
exec MySP '2','HPD0002',
'emppersonal.empfname,
mdesigmast.designame AS CurrentDesignation,
/*Change the below line*/
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'
到
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'
我正在使用动态 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
'
当我执行那个过程时,我得到这个错误:
Msg 102, Level 15, State 1, Line 19
Incorrect syntax near '2'.Msg 105, Level 15, State 1, Line 19
Unclosed quotation mark after the character string '))'.
如何解决上述错误?
谢谢
和其他地方一样,需要使用双撇号:
ISNULL(CONVERT(varchar, pisempprofessional.appdate, 103),'''')
应该就可以了
The apostrophe, or single quote, is a special character in SQL that specifies the beginning and end of string data. This means that to use it as part of your literal string data you need to escape the special character. With a single quote this is typically accomplished by doubling your quote.
喜欢@Mackan提到
The apostrophe, or single quote, is a special character in SQL that specifies the beginning and end of string data. This means that to use it as part of your literal string data you need to escape the special character. With a single quote this is typically accomplished by doubling your quote.
因此将您的 Param
从
exec MySP '2','HPD0002',
'emppersonal.empfname,
mdesigmast.designame AS CurrentDesignation,
/*Change the below line*/
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'
到
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'