Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql server存储过程动态选择_Sql Server - Fatal编程技术网

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'')'