Sql server 在更新中用空格填充列值

Sql server 在更新中用空格填充列值,sql-server,sql-server-2012,spaces,nvarchar,Sql Server,Sql Server 2012,Spaces,Nvarchar,如何在SQL Server 2012的更新SQL语句中自动将空格填充到预先确定的长度 我有一个有几列的表,比如 Col1 NVARCHAR(10) Col2 NVARCHAR(100) Col3 NVARCHAR(200) Col4 NVARCHAR(50) 还有更多 如果列的值为NULL或“”,我将使用空格将列更新为预定长度(列的长度) 对于Col3,如果值为NULL或“”,则将空格改为200空格(“”) 如果值中有任何字符,'abcd',请填充(右键)到200个空格。然后,最后是4个非空

如何在SQL Server 2012的更新SQL语句中自动将空格填充到预先确定的长度

我有一个有几列的表,比如

Col1 NVARCHAR(10)
Col2 NVARCHAR(100)
Col3 NVARCHAR(200)
Col4 NVARCHAR(50) 
还有更多

如果列的值为
NULL或“”
,我将使用空格将列更新为预定长度(列的长度)

对于Col3,如果值为
NULL或“”
,则将空格改为200空格(
“”
) 如果值中有任何字符,
'abcd'
,请填充(右键)到200个空格。然后,最后是4个非空格字符和196个空格字符

例如,Col1的长度为10

1) Value = NULL    , Col1 value = '         ' (10 spaces)
2) Value = ''      , Col1 value = '         ' (10 spaces)
2) Value = 'abc'   , Col1 value = 'abc      ' (abc and 7 spaces)
如何在更新SQL中做到这一点

也许用

select column_name, data_type, character_maximum_length    
  from information_schema.columns  
 where table_name = 'myTable'


更多信息,请尝试以下操作,左侧用于将长度保持在列长度以下,而空格可确保字段中填充空格:

create table test (col1 varchar(10), col2 varchar(15))
GO

insert into test (col1, col2)
    values   ('', '')
            ,(NULL, NULL)
            ,('abc', 'abc')

UPDATE test
    SET  col1 = LEFT(COALESCE(col1, '') + SPACE(COL_LENGTH('test', 'col1')), COL_LENGTH('test', 'col1'))
        ,col2 = LEFT(COALESCE(col2, '') + SPACE(COL_LENGTH('test', 'col2')), COL_LENGTH('test', 'col2'))
FROM    test

SELECT  *
FROM    test

尝试以下操作,左侧用于将长度保持在列长度以下,而空格可确保字段中填充空格:

create table test (col1 varchar(10), col2 varchar(15))
GO

insert into test (col1, col2)
    values   ('', '')
            ,(NULL, NULL)
            ,('abc', 'abc')

UPDATE test
    SET  col1 = LEFT(COALESCE(col1, '') + SPACE(COL_LENGTH('test', 'col1')), COL_LENGTH('test', 'col1'))
        ,col2 = LEFT(COALESCE(col2, '') + SPACE(COL_LENGTH('test', 'col2')), COL_LENGTH('test', 'col2'))
FROM    test

SELECT  *
FROM    test

我不明白你到底想要什么,但我明白的是:

CREATE TABLE MyTable (
    Col1 NVARCHAR(200),
    Col2 NVARCHAR(100),
    Col3 NVARCHAR(200),
    Col4 NVARCHAR(50)
    );
    INSERT INTO MyTable VALUES (NULL, NULL, NULL, NULL), ('ABC', NULL, NULL, NULL);
-- You can do the same for the other cols
        UPDATE MyTABLE 
        SET Col1 = REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2)
        WHERE Col1 IS NULL;

SELECT *
FROM MyTable;

更新:

以下是如何在一句话中做到这一点:

UPDATE MyTABLE 
SET Col1 = (SELECT CASE WHEN (Col1 IS NULL) OR (Col1 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2) 
                ELSE Col1 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col1')/2)- LEN(Col1)) END),
Col2 = (SELECT CASE WHEN (Col2 IS NULL) OR (Col2 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col2')/2) 
                ELSE Col2 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col2')/2)- LEN(Col2)) END),                
Col3 = (SELECT CASE WHEN (Col3 IS NULL) OR (Col3 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2) 
                ELSE Col3 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col3')/2)- LEN(Col3)) END), 
Col4 = (SELECT CASE WHEN (Col4 IS NULL) OR (Col4 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col4')/2) 
                ELSE Col4 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col4')/2)- LEN(Col4)) END);

我不知道你到底想要什么,但以下是我的理解:

CREATE TABLE MyTable (
    Col1 NVARCHAR(200),
    Col2 NVARCHAR(100),
    Col3 NVARCHAR(200),
    Col4 NVARCHAR(50)
    );
    INSERT INTO MyTable VALUES (NULL, NULL, NULL, NULL), ('ABC', NULL, NULL, NULL);
-- You can do the same for the other cols
        UPDATE MyTABLE 
        SET Col1 = REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2)
        WHERE Col1 IS NULL;

SELECT *
FROM MyTable;

更新:

以下是如何在一句话中做到这一点:

UPDATE MyTABLE 
SET Col1 = (SELECT CASE WHEN (Col1 IS NULL) OR (Col1 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2) 
                ELSE Col1 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col1')/2)- LEN(Col1)) END),
Col2 = (SELECT CASE WHEN (Col2 IS NULL) OR (Col2 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col2')/2) 
                ELSE Col2 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col2')/2)- LEN(Col2)) END),                
Col3 = (SELECT CASE WHEN (Col3 IS NULL) OR (Col3 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col1')/2) 
                ELSE Col3 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col3')/2)- LEN(Col3)) END), 
Col4 = (SELECT CASE WHEN (Col4 IS NULL) OR (Col4 = '') THEN 
                REPLICATE(' ', COL_LENGTH('MyTable', 'Col4')/2) 
                ELSE Col4 + REPLICATE(' ', (COL_LENGTH('MyTable', 'Col4')/2)- LEN(Col4)) END);

@maSTAShuFu遗留应用程序使用Sql Server为外部公司生成CSV文件(采用空格格式)。如果使用nchar而不是nvarchar,您将获得所需的行为。但不要这样做。因为这将是对资源的高度低效利用,所以不可能,遗留问题app@Kiquenet,如何将数据从CSV传输到sql?SSI应允许您转换数据。您可以动态应用修剪。我不明白你为什么不能。如果是手动的,您仍然可以修剪CSV字段。@Kiquenet,为什么您的旧版应用程序关心数据如何存储在数据库中?查询数据时根据需要添加空格。@maSTAShuFu旧版应用程序使用Sql Server为extern company生成CSV文件(空格格式)。如果使用nchar而不是nvarchar,您将获得所需的行为。但不要这样做。因为这将是对资源的高度低效利用,所以不可能,遗留问题app@Kiquenet,如何将数据从CSV传输到sql?SSI应允许您转换数据。您可以动态应用修剪。我不明白你为什么不能。如果是手动的,您仍然可以修剪CSV字段。@Kiquenet,为什么您的旧版应用程序关心数据如何存储在数据库中?在查询数据时,根据需要添加空格。为什么选择COLU LENGTH/2?除以2?@Kiquenet nvarchar(1)=2个字节,而不是1,所以除以2。为什么列长度/2?除以2?@Kiquenet nvarchar(1)=2个字节,而不是1,因此除以2。