代码之家  ›  专栏  ›  技术社区  ›  KVNA

从两个存储过程创建字符串模板

  •  -1
  • KVNA  · 技术社区  · 7 年前

    我有两个返回结果集的存储过程。

    如何使用它们填充字符串并更新另一列?

    exec getEmailSignatureDetails 'Jane', 'Doe'
    
    exec getFeaturedAccount 'June'
    

    这两个返回列我想映射到变量。

    然后我想把变量放入一个字符串中。

    然后用该字符串更新另一个表中的列。

    输出自 getEmailSignatureDetails :

    addCity       | addLine     | addSt |  addZip | fName | lName
    --------------+-------------+-------+---------+-------+------
    San Francisco | 777 SV Lane | CA    |  94016  | Jane  | Doe
    

    输出自 getFeaturedAccount :

    month | img      
    ------+----------
    June  | base64...
    

    我想把这个变成一个像

    Your package has been delivered to 
    @fName @lName
    @addLine
    @addCity @addSt, @addZip
    @img
    

    然后用与名称匹配的字符串更新列。

    1 回复  |  直到 7 年前
        1
  •  2
  •   John Cappelletti    7 年前

    如果我理解您的问题,您希望通过宏替换动态地填写模板

    例子

    -- Create some Sample Data
    Declare @getEmailSignatureDetails Table ([addCity] varchar(50),[addLine] varchar(50),[addSt] varchar(50),[addZip] varchar(50),[fName] varchar(50),[lName] varchar(50))
    Insert Into @getEmailSignatureDetails Values 
     ('San Francisco','777 SV Lane','CA',94016,'Jane','Doe')
    
    Declare @getFeaturedAccount Table ([month] varchar(50),[img] varchar(50))
    Insert Into @getFeaturedAccount Values 
     ('June','base64..')
    
    
    
    -- Declare the Template
    Declare @Template varchar(max) ='
    Your package has been delivered to 
    @fName @lName
    @addLine
    @addCity @addSt, @addZip
    @img
    '
    
    -- Populate the Template
    Select @Template = replace(@Template,'@'+Field,Value)
     From ( 
            Select C.*
             From (values (convert(XML,(Select * From  @getEmailSignatureDetails Join  @getFeaturedAccount on [month]='June' For XML Raw ) ) ) ) A(XMLData)
             Cross Apply (
                            Select Field = a.value('local-name(.)','varchar(100)')
                                  ,Value = a.value('.','varchar(max)') 
                             From  A.XMLData.nodes('/row')  as C1(n)
                             Cross Apply C1.n.nodes('./@*') as C2(a)
                             Where a.value('local-name(.)','varchar(100)') not in ('Column1','Column2')
                         ) C
         ) A
    

    更新的模板

    Your package has been delivered to 
    Jane Doe
    777 SV Lane
    San Francisco CA, 94016
    base64.. 
    

    如果有助于可视化,则子查询是一个“动态”unpivot,并生成以下内容:

    Field     Value
    addCity   San Francisco
    addLine   777 SV Lane
    addSt     CA
    addZip    94016
    fName     Jane
    lName     Doe
    month     June
    img       base64..   -- (presumably would be the image)