-1

此过程应返回前一天基于@refdate.

如果我只在 DB 上执行这个选择,它可以完美地工作,但是我的过程代码有问题。

alter procedure [dbo].[SavePosition]
(@Refdate as varchar(15) =null)
as
begin try
set nocount on

declare @YdDate as varchar(15)

SELECT top 1 @YdDate = TradeDate from Trades where TradeDate < @Refdate ORDER BY TradeDate DESC;


declare @SQL AS VARCHAR(4000)

set @SQL='


Select  ('''+ @Refdate +''') AS Refdate, Prodname.name as Product, Inst.Name as Instrument,prodname.Id as prodId, Strat.Name as Strategy,Strat.Id as StratId, Pos.Tag, AssetGroup.name as AssetGroup, AssetClass.Name as AssetClass,

......[200 lines of code]..........

order by Strat.name,Prodname.Name
;'
EXEC(@SQL)
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber
     ,ERROR_SEVERITY() AS ErrorSeverity
     ,ERROR_STATE() AS ErrorState
     ,ERROR_PROCEDURE() AS ErrorProcedure
     ,ERROR_LINE() AS ErrorLine
     ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
return
4

1 回答 1

2

您不需要动态 SQL...在您进一步评论后转换为函数而不是存储过程。

CREATE FUNCTION [dbo].[teste1]
(@Refdate as varchar(15) =null)
RETURNS VARCHAR(15) AS
BEGIN
  declare @YdDate as varchar(15)

  SELECT TOP 1 @YdDate = TradeDate FROM Trades WHERE TradeDate < @Refdate 
  ORDER BY TradDate DESC;

  RETURN @YdDate
END

然后作为示例用法SELECT dbo.teste('2014-12-10')

显然,如果您的日期字符串以可以按字母顺序排序的格式存储(例如YYYYMMDD,或'20150106') ,这将是可靠的

于 2015-01-06T14:56:25.100 回答