【问题标题】:How to programmatically concat data into SQL Server columns to match the max_value?如何以编程方式将数据连接到 SQL Server 列中以匹配 max_value?
【发布时间】:2015-08-25 16:57:26
【问题描述】:

我们正在使用STUFF 将数据插入表中,并使用CASE 语句调整过程中的某些列,以更改数据以满足数据测试的特定需求。

是否有类似的方法可以在插入时向列中添加额外数据,而无需提前知道列中还剩多少空间?

因此,如果我找到长度为 15 的 First_Name 列并且我插入的行的名称为 John,如何使插入看起来像 JohnAAAAAAAAAAAAA,同时还要处理名称可能是 Steve 而我想要 A 的情况填满剩余的空间。

我认为从sys.columns 获取max_length 并知道现有值的索引(可能使用PATINDEX),我可以以某种方式添加所需的数据来填充空间。

【问题讨论】:

    标签: sql sql-server concatenation sql-insert


    【解决方案1】:

    我建议使用REPLICATE()LEN() 函数,如下所示:

    DECLARE @Table TABLE (NAME VARCHAR(15))
    
    INSERT INTO @Table (Name) VALUES ('John')
    INSERT INTO @Table (Name) VALUES ('Jeremiah')
    INSERT INTO @Table (Name) VALUES ('Jehosaphat')
    
    SELECT 
        Name,
        Name + REPLICATE('A', 15-LEN(Name))
    FROM @Table 
    

    另一个示例是使用LEFT() 函数来确定返回字符串的大小,该字符串由您的值和连接的文本组成。这是这样做的一种方法,这次是在INSERT 方面:

    DECLARE @Table TABLE (NAME VARCHAR(15))
    
    INSERT INTO @Table (Name) (SELECT LEFT('John' + REPLICATE('A', 15), 15))
    INSERT INTO @Table (Name) (SELECT LEFT('Jeremiah' + REPLICATE('A', 15), 15))
    INSERT INTO @Table (Name) (SELECT LEFT('Jehosaphat' + REPLICATE('A', 15), 15))
    
    SELECT 
        Name 
    FROM @Table 
    

    编辑 1: 下面的代码将在插入后更新您的数据 - 因为从逻辑上讲,直到您加载所有记录之后,您才会知道最大长度是多少,所以我将插入名称,然后在事后返回更新它们。

    -- Prepare data
    DECLARE @Table TABLE (NAME VARCHAR(50))
    INSERT INTO @Table VALUES ('John'), ('Jeremiah'), ('Jehoshephat'), ('John Jacob Jingleheimer Schmidt')
    
    -- Check it: a set of names with varying values
    SELECT Name 
    FROM @Table 
    
    -- Determine and store the maximum character length
    DECLARE @MaxLen INT
    SET @MaxLen = (SELECT MAX(LEN(NAME)) FROM @Table)
    
    -- update each record to pad with 'A' until the maximum character length is reached
    UPDATE @Table
    SET NAME = NAME + REPLICATE('A', @MaxLen - LEN(NAME))
    
    -- Confirm it works as expected
    SELECT * 
    FROM @Table
    

    【讨论】:

    • 那些看起来可以工作,我可以让它们在我想记录长度的那些表上工作,但是有没有办法以编程方式获取剩余长度?我有大约 10 个字段,它们都有不同的长度变量,理想情况下,我只需通过 max_length 确定要添加的 A 的数量以及已经输入的任何内容
    • 我已经推送了一个编辑 - 如果这是一个两步操作,第一步插入,第二步更新,可以吗?否则,我看不出您打算如何在加载所有记录之前确定最大长度。
    • 我最终可能会按照您的编辑方式进行操作,因为很难将子查询添加到 STUFF select 语句中,因此我可以计算出需要添加的长度。
    【解决方案2】:

    您可以显式附加一个填充,然后使用左函数来获得所需的长度,而不是使用东西,就像这样......

    DECLARE @T TABLE (Name VARCHAR(10))
    
    INSERT INTO @T VALUES ('John'),('Steve')
    
    SELECT Name 
          ,NameNew = LEFT(Name + 'AAAAAAAAAA',10)
    FROM @T
    
    
    
    RESULT:
    
    ╔═══════╦════════════╗
    ║ Name  ║  NameNew   ║
    ╠═══════╬════════════╣
    ║ John  ║ JohnAAAAAA ║
    ║ Steve ║ SteveAAAAA ║
    ╚═══════╩════════════╝
    

    【讨论】:

    • 如果我没有将它添加到 Stuff 插入中,但我受到它的限制
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多