2012-11-27 18 views
0

這個信息,我有:一個字符串操作難題2008 R2

Column workflowname has this value ='12STD_Orientations_Workflow' 
Column canceldate has a date value 

我需要一個值分配給列CAMPAIGNNAME這樣的:

假設在canceldate值在十一月2012年,該值必須是'12STD_Orientations_2012_Nov'。如果該值在2013年1月,則該值必須爲'12STD_Orientations_2013_Jan'。等等。

我正在考慮做一個函數,並通過調用MyFunction(workflowname,canceldate)來指定canceldate的值(在INSERT子句中)。但我不知道如何編寫函數內的代碼!

+0

什麼客戶端您使用的語言,如果有的話?你有什麼嘗試? – hd1

回答

1

這是一個能產生你想要的結果的版本。這個版本反轉@str值的當前值,然後查找字符串中的第一_

declare @str varchar(100) = '12STD_Orientations_Workflow' 
declare @dt datetime = '2012-01-01' 


select left(@str, len(@str) - charindex('_', REVERSE(@str))) 
    + '_' 
    + cast(YEAR(@dt) as char(4)) 
    + '_' 
    + CONVERT(char(3), @dt, 109) 

SQL Fiddle with Demo

然後,如果你想將這個函數中,你可以使用:

create function dbo.New_Workflow 
(
    @origName varchar(200), 
    @dt datetime 
) 
RETURNS varchar(200) 
AS 
BEGIN 
    declare @newvalue varchar(100) 
    select @newvalue = left(@origName, len(@origName) - charindex('_', REVERSE(@origName))) 
      + '_' 
      + cast(YEAR(@dt) as char(4)) 
      + '_' 
      + CONVERT(char(3), @dt, 109) 
    RETURN @newvalue 
END; 

然後調用這個你可以使用:

declare @str varchar(100) = '12STD_Orientations_Workflow' 
declare @dt datetime = '2012-11-01' 

select dbo.New_Workflow(@str, @dt) 

SQL Fiddle with Demo

結果是:

|     COLUMN_0 | 
------------------------------- 
| 12STD_Orientations_2012_Nov | 

現在,如果你需要從表中拉這個,你可以使用:

select dbo.New_Workflow(yourWorkFlowNameCol, yourDateColumn) 
from yourtable 
+0

非常好,謝謝! – Amarundo

1
CREATE FUNCTION dbo.MyFunction 
(
    @originalString VARCHAR(200), 
    @dateFromField DATETIME 
) 
RETURNS varchar(200) 
AS 
BEGIN 
    DECLARE @newString VARCHAR(200) 
    SELECT @newString = LEFT(@originalString,19) + LEFT(CONVERT(VARCHAR(19),@dateFromField,109),3) 
    RETURN @newString 
END; 
+1

這不會從WorkflowName值中刪除_Workflow後綴 – DeanOC

+0

已更新到包括原始字符串的左側19個字符。這會從文本中刪除「工作流程」,但保留下劃線以供使用。 – steamrolla

+0

非常感謝。我只需要選擇一個。 – Amarundo