2012-04-24 519 views
3

我正在创建一个存储过程,它获取一些参数,然后这些参数被发送到另一个存储过程,我从openrowset调用,但我得到一些语法错误。如何使用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 
        '''[email protected]+''', 
        '''[email protected]+''', 
        '''[email protected]+''', 
        '''[email protected]+''', 
        ''1'', 
        ''0'', 
        ''All'', 
        ''Current'', 
        '''[email protected]+''', 
        '''[email protected]+''' 
       ') 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'', 
'''[email protected]+''', 
'''[email protected]+''', 
'''[email protected]+''', 
'''[email protected]+'''') 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 '+'. 

...但如果我使用硬编码值,它的工作参数!

请帮忙!

回答

7

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 

等等...... 希望有所帮助。亲切的问候, 斯特凡

+0

没有用的,如果使用OPENROWSET调用存储过程的要点是把结果放到一个SELECT语句。我想这简直是无法完成的,而被调用的存储过程需要更改为一个函数。这是我最终解决的解决方案。 – Neo 2013-07-11 16:30:57

1
-- 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 
相关问题