【问题标题】:how to use openrowset to execute a stored procedure with parameters如何使用openrowset执行带参数的存储过程
【发布时间】:2012-04-24 06:25:37
【问题描述】:

我正在创建一个存储过程,它获取一些参数,然后这些参数被发送到我从 openrowset 调用的另一个存储过程,但我遇到了一些语法错误。

CREATE PROCEDURE UpdatePrevFYConfigData 
    -- Add the parameters for the stored procedure here

        @startDate datetime,
        @endDate datetime,
        @productGroup varchar(8000) = 'All',
        @projectType varchar(500) = 'All',
        @businessUnit nvarchar(50) = 'All',
        @developmentLocation nvarchar(100) = 'All'
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

declare @start varchar(50)
declare @end varchar(50) 

set @start = cast(@startDate as varchar(40))
set @end = cast(@endDate as varchar(40))

    -- Insert statements for procedure here
select round(avg(a.DeviationDeadline),2) as DeviationDeadline, 
       round(avg(a.DeviationDefinition),2) as DeviationDefinition,
       round(avg(a.DeviationRDCosts),2) as DeviationRDCosts,
       round(avg(a.FunctionsAdded) + avg(a.FunctionsDeleted),2) as NotRealizedFuncs, 
       round(avg(a.DeviationPM2000Aufwand),2) as DeviationPM200Aufwand,
       round(avg(b.Defect),2) as Defect
       into #tempTable 
from openrowset('SQLNCLI', 
                'Server=.\sqlexpress;Trusted_Connection=yes;',  
                'SET NOCOUNT ON;SET FMTONLY OFF;EXEC [BSC_DB].dbo.SelectScorecardGraphData
                    '''+@start+''',
                    '''+@end+''',
                    '''+@productGroup+''',
                    '''+@projectType+''',
                    ''1'',
                    ''0'',
                    ''All'',
                    ''Current'',
                    '''+@businessUnit+''',
                    '''+@developmentLocation+'''
                ') as a,

    openrowset('SQLNCLI', 'Server=.\sqlexpress;Trusted_Connection=yes;',  'SET NOCOUNT ON;SET FMTONLY OFF;EXEC [BSC_DB].dbo.GetSPCDefectDistributionData
'''+cast(@startDate as varchar(40))+''',
'''+cast(@endDate as varchar(40))+''',
''Defect'',
'''+@projectType+''',
'''+@productGroup+''',
'''+@businessUnit+''',
'''+@developmentLocation+'''') as b


update dbo.EA_ProcessScorecard_Config_Tbl
set EPC_Deviation = case EPC_Metric
    when 'PM200' then (select  DeviationDefinition from #tempTable)
    when 'PM300' then (select  DeviationDeadline from #tempTable)
    when 'Cost'  then (select  DeviationRDCosts from #tempTable)
    when 'PM150' then (select  DeviationPM200Aufwand from #tempTable)
    when 'Defect' then (select Defect from #tempTable)
    when 'Funcs' then (select NotRealizedFuncs from #tempTable)
END
where EPC_Description = 'PrevFY' and EPC_FYYear = '0'

drop table #tempTable

END 

GO

我无法创建它并收到错误消息:

Msg 102, Level 15, State 1, Procedure UpdatePrevFYConfigData, 
Line 38 Incorrect syntax near '+'.

...但是如果我对参数使用硬编码值,它就可以工作!!

请帮忙!

【问题讨论】:

    标签: sql-server-2008 tsql stored-procedures openrowset


    【解决方案1】:

    OPENROWSET 和 OPENDATASOURCE 都应该只用于访问外部数据,比如快速而肮脏的解决方案,或者无法配置永久链接服务器的情况。这些功能不提供链接服务器提供的所有功能。 OPENROWSET 和 OPENDATASOURCE 的参数不支持变量。它们必须指定为字符串文字。如果需要将变量作为参数传递给这些函数,则可以使用 EXEC 语句动态构造和执行包含这些变量的查询字符串。 类似于(未检查语法)

    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT *
    FROM OPENROWSET(''SQLNCLI'',''server=.\sqlexpress;Trusted_Connection=yes'',''SET NOCOUNT ON;SET FMTONLY OFF;EXEC [BSC_DB].dbo.SelectScorecardGraphData ''''' + cast(@param1 as varchar(10)) + ''''',''' + cast(@param2 as varchar(n)) ''')'
    EXEC @sqlCommand
    

    等等…… 希望有帮助。亲切的问候, 斯蒂芬

    【讨论】:

    • 如果使用 OPENROWSET 调用存储过程的目的是将结果放入 SELECT 语句中,则没有用。我想它根本无法完成,并且需要将被调用的存储过程更改为函数。这是我最终确定的解决方案。
    【解决方案2】:
        -- FOR USING OPENROWSETS
        EXEC sp_configure 'Ad Hoc Distributed Queries'
            ,1
    
        RECONFIGURE
    
        DECLARE @SQL NVARCHAR(MAX)
    
        SET @SQL = 'INSERT INTO #TABLESIZESYEAR SELECT NULL AS [TABLE NAME], * FROM OPENROWSET 
                        (''SQLOLEDB'',''Server=(local);TRUSTED_CONNECTION=YES;'',''set fmtonly off EXEC one.[dbo].[InvestigateDataGrowthByYearAndClient] @pDATECOLUMN =' + @YEARCOLUMN + ' ,
                            @pTABLENAME = ' + @TABLENAME + ' WITH RESULT SETS(
                            ([YEAR NAME] NVARCHAR(5) NULL
                                    , [NUMBER OF ROWS] CHAR(11)    
                                    , [RESERVED SPACE] VARCHAR(18) 
                                    , [DATA SPACE] VARCHAR(18)    
                                    , [INDEX SIZE] VARCHAR(18)    
                                    , [UNUSED SPACE] VARCHAR(18) )
                        )
                            ;'') '
    
        DECLARE @ParmDefinition NVARCHAR(500) = '@pDATECOLUMN NVARCHAR(20)
                                ,@YEARCOLUMN NVARCHAR(20)
                                ,@pTABLENAME NVARCHAR(60)';
    
        EXECUTE sp_executesql @sql
            ,@ParmDefinition
            ,@YEARCOLUMN = @YEARCOLUMN
            ,@pDATECOLUMN = @YEARCOLUMN
            ,@pTABLENAME = @TABLENAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多