Sql server sql server存储过程动态选择
我有一个以下格式的存储过程Sql server sql server存储过程动态选择,sql-server,Sql Server,我有一个以下格式的存储过程 create PROCEDURE [dbo].[test proc] @identifier varchar(20), @issuerName varchar(max), @max_records int=1000 AS BEGIN declare @select nvarchar(30) SELECT @identifier as '@identifier' , ( SELECT MoodysOrgID as '@Mo
create PROCEDURE [dbo].[test proc]
@identifier varchar(20),
@issuerName varchar(max),
@max_records int=1000
AS
BEGIN
declare @select nvarchar(30)
SELECT @identifier as '@identifier'
, (
SELECT
MoodysOrgID as '@MoodysOrgID'
,ReportDate as '@ReportDate'
,m.UpdateTime as '@UpdateTime'
,m.FileCreationDate as '@FileCreationDate'
from mfm_financial_ratios m
inner join mfm_financial_ratios_coa c on c.AcctNo = m.AcctNo
where ReportDate in (select distinct top (@max_records) reportdate from mfm_financial_ratios where MoodysOrgID = m.MoodysOrgID)
and m.MoodysOrgID=(select top 1 IssuerID_Moodys as id from loans where LIN=@identifier or LoanXID=@identifier
and ParentName_Moodys=@issuerName and IssuerID_Moodys is not null)
order by ReportDate desc
FOR XML PATH('FinRatios'), TYPE
)
FOR XML PATH('FinRatiosHistory')
END
但我想让ByQuery作为动态sql执行
我的存储过程看起来像
create PROCEDURE [dbo].[test proc]
@identifier varchar(20),
@issuerName varchar(max),
@max_records int=1000
AS
BEGIN
declare @select nvarchar(30)
set @select = N'SELECT @identifier as '@identifier'
, (
SELECT
MoodysOrgID as '@MoodysOrgID'
,ReportDate as '@ReportDate'
,m.UpdateTime as '@UpdateTime'
,m.FileCreationDate as '@FileCreationDate'
from mfm_financial_ratios m
inner join mfm_financial_ratios_coa c on c.AcctNo = m.AcctNo
where ReportDate in (select distinct top (@max_records) reportdate from mfm_financial_ratios where MoodysOrgID = m.MoodysOrgID)
and m.MoodysOrgID=(select top 1 IssuerID_Moodys as id from loans where LIN=@identifier or LoanXID=@identifier
and ParentName_Moodys=@issuerName and IssuerID_Moodys is not null)
order by ReportDate desc
FOR XML PATH('FinRatios'), TYPE
)
FOR XML PATH('FinRatiosHistory')'
exec @select
END
以下存储过程出现问题,因为其中使用了逗号。有人能告诉我您的正确操作方法吗问题不是逗号。你主要有两个问题:第一,你没有正确地转义引号。第二,没有正确连接变量。以下是两者的一个示例: 对于串联变量:在第一个select行中,不能执行以下操作:
SELECT @identifier as '@identifier'
因为sql不知道以这种方式对@identifier做什么。应通过以下方式连接变量:
SELECT @identifier as ' + @identifier + '.. everything else goes here
此外,当您必须连接max_记录时,由于它是一个int变量,您应该首先将其强制转换为varchar,如下所示:
select distinct top (' + cast(@max_records as varchar(10) + ') ....
<强>每当在字符串的中间使用变量(例如@ Max记录)时,为了使SQL知道它是一个变量,而不只是字符串,就必须将其连接起来。你不是用max_唱片、@issuerName等做的
对于转义引号:当不希望select字符串意外结束时,需要转义单引号。例如:FOR XML PATH('FinRatiosHistory')'
你应该用双引号对它们进行转义(如果你不懂,谷歌转义单引号sql)
你有两个问题。。。首先,您需要通过将每个单引号(
“
)更改为双引号(”
)来转义动态查询中的引号。下一个问题是,动态sql中的变量超出范围,需要在使用时传递sp_ExecuteSQL
。但是,我看不出有什么理由希望通过动态SQL实现这一点。我可以问一下你们为什么要这样做吗?我会因为不同的原因将查询分解成多个部分,我并没有在我的示例存储过程中展示
FOR XML PATH(''FinRatiosHistory'')'