Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更改列名的大小写_Sql_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql 更改列名的大小写

Sql 更改列名的大小写,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我的仓库中有一个表,它的列都是大写的。它的脚本如下所示: CREATE TABLE [dbo].[Outlet]( [OUTLET_KEY] [varchar](10) NOT NULL, [OUTLET] [varchar](8) NULL, [CITY_CODE] [varchar](4) NULL, [OUTLET_NAME] [varchar](25) NULL, [COUNTRY_CODE] [varchar](3) NULL, [EXT

我的仓库中有一个表,它的列都是大写的。它的脚本如下所示:

CREATE TABLE [dbo].[Outlet](
    [OUTLET_KEY] [varchar](10) NOT NULL,
    [OUTLET] [varchar](8) NULL,
    [CITY_CODE] [varchar](4) NULL,
    [OUTLET_NAME] [varchar](25) NULL,
    [COUNTRY_CODE] [varchar](3) NULL,
    [EXTENDED_CATEGORY_CODE] [varchar](2) NULL,
    [PHONE_NUMBER] [varchar](17) NULL
) ON [PRIMARY]
我想将表中列的大小写更改为更可读的格式

出口钥匙 出口 城市代码 出口名称 国家/地区代码。。。。。。。
大约有15个表和200个列。如何更改所有表的大小写?

我将使用smo编写一个小批量程序,以枚举所有表和表列并更改列的名称。

我将使用smo编写一个小批量程序,以枚举所有表和表列并更改列的名称。

以下是生成sp_仅使用T-SQL重命名命令,但这与您的命名定义不完全匹配。要将任何下划线后面的第一个字母大写,需要进行更精细的处理,例如26个嵌套的replacename、“_a”和“_a”调用,但这可能是一个有用的开始:

SELECT 'EXEC sp_rename ''' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + '.' + QUOTENAME([name]) + ''', '
    + '''' 
    + QUOTENAME(UPPER(LEFT([name],1))+LOWER(SUBSTRING([name], 2, LEN([name])))) 
    + ''', ''COLUMN'';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.Outlet');
在SSMS查询窗口中运行该脚本,然后复制输出并在新窗口中运行

好的,这是执行嵌套替换调用的版本。虽然不漂亮,但它很管用:

USE tempdb;
GO

SET NOCOUNT ON;
GO

CREATE TABLE dbo.Outlet
(
    [OUTLET_KEY] [varchar](10) NOT NULL,
    [OUTLET] [varchar](8) NULL,
    [CITY_CODE] [varchar](4) NULL,
    [OUTLET_NAME] [varchar](25) NULL,
    [COUNTRY_CODE] [varchar](3) NULL,
    [EXTENDED_CATEGORY_CODE] [varchar](2) NULL,
    [PHONE_NUMBER] [varchar](17) NULL,
) ON [PRIMARY];
GO

SELECT 'EXEC sp_rename '''
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + '.' + QUOTENAME([name]) + ''', '
    + '''' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             QUOTENAME(UPPER(LEFT([name],1))+LOWER(SUBSTRING([name], 2, LEN([name]))))
             , '_a', '_A'), '_b', '_B'), '_c', '_C'), '_d', '_D'), '_e', '_E')
             , '_f', '_F'), '_g', '_G'), '_h', '_H'), '_i', '_I'), '_j', '_J')
             , '_k', '_K'), '_l', '_L'), '_m', '_M'), '_n', '_N'), '_o', '_O')
             , '_p', '_P'), '_q', '_Q'), '_r', '_R'), '_s', '_S'), '_t', '_T')
             , '_u', '_U'), '_v', '_V'), '_w', '_W'), '_x', '_X'), '_y', '_Y'), '_z', '_Z')
    + ''',' + '''COLUMN'';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.Outlet');

GO
DROP TABLE dbo.Outlet;

这里有一种简单的方法,可以仅使用T-SQL生成sp_rename命令,但这与您的命名定义并不完全匹配。要将任何下划线后面的第一个字母大写,需要进行更精细的处理,例如26个嵌套的replacename、“_a”和“_a”调用,但这可能是一个有用的开始:

SELECT 'EXEC sp_rename ''' 
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + '.' + QUOTENAME([name]) + ''', '
    + '''' 
    + QUOTENAME(UPPER(LEFT([name],1))+LOWER(SUBSTRING([name], 2, LEN([name])))) 
    + ''', ''COLUMN'';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.Outlet');
在SSMS查询窗口中运行该脚本,然后复制输出并在新窗口中运行

好的,这是执行嵌套替换调用的版本。虽然不漂亮,但它很管用:

USE tempdb;
GO

SET NOCOUNT ON;
GO

CREATE TABLE dbo.Outlet
(
    [OUTLET_KEY] [varchar](10) NOT NULL,
    [OUTLET] [varchar](8) NULL,
    [CITY_CODE] [varchar](4) NULL,
    [OUTLET_NAME] [varchar](25) NULL,
    [COUNTRY_CODE] [varchar](3) NULL,
    [EXTENDED_CATEGORY_CODE] [varchar](2) NULL,
    [PHONE_NUMBER] [varchar](17) NULL,
) ON [PRIMARY];
GO

SELECT 'EXEC sp_rename '''
    + QUOTENAME(OBJECT_SCHEMA_NAME([object_id])) 
    + '.' + QUOTENAME(OBJECT_NAME([object_id])) 
    + '.' + QUOTENAME([name]) + ''', '
    + '''' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
             QUOTENAME(UPPER(LEFT([name],1))+LOWER(SUBSTRING([name], 2, LEN([name]))))
             , '_a', '_A'), '_b', '_B'), '_c', '_C'), '_d', '_D'), '_e', '_E')
             , '_f', '_F'), '_g', '_G'), '_h', '_H'), '_i', '_I'), '_j', '_J')
             , '_k', '_K'), '_l', '_L'), '_m', '_M'), '_n', '_N'), '_o', '_O')
             , '_p', '_P'), '_q', '_Q'), '_r', '_R'), '_s', '_S'), '_t', '_T')
             , '_u', '_U'), '_v', '_V'), '_w', '_W'), '_x', '_X'), '_y', '_Y'), '_z', '_Z')
    + ''',' + '''COLUMN'';'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.Outlet');

GO
DROP TABLE dbo.Outlet;
试一试:

CREATE FUNCTION dbo.Get_Proper_Cased_String
(@my_string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE
        @work_string    VARCHAR(MAX),
        @final_string   VARCHAR(MAX),
        @position       SMALLINT

    SET @final_string = ''
    SET @position = CHARINDEX(' ', @my_string)

    WHILE (@position > 0)
    BEGIN
        SET @work_string = LEFT(@my_string, @position - 1)

        IF (@work_string <> '')
            SET @final_string = @final_string + ' ' + UPPER(SUBSTRING(@work_string, 1, 1)) + LOWER(SUBSTRING(@work_string, 2, LEN(@work_string) - 1))

        SET @my_string = RIGHT(@my_string, LEN(@my_string) - @position)

        SET @position = CHARINDEX(' ', @my_string)
    END

    /* changed this to LTRIM to remove trailing space that was getting converted to underscore */
    SET @final_string = LTRIM (@final_string + ' ' + UPPER(SUBSTRING(@my_string, 1, 1)) + LOWER(SUBSTRING(@my_string, 2, LEN(@my_string) - 1)))

    RETURN @final_string
END
GO

SELECT
     'EXEC sp_rename ''' + O.name + '.' + C.name + ''', ''' + REPLACE(dbo.Get_Proper_Cased_String(REPLACE(C.name, '_', ' ')), ' ', '_') + ''', ''COLUMN'''
FROM
    sys.objects O
INNER JOIN sys.columns C ON
    C.object_id = O.object_id
WHERE
    O.object_id = OBJECT_ID('<table_name>')
此代码假定您仅有的非字符值是uu,并且没有连续的下划线,即“我的uuuu”列将给出错误的结果。

尝试一下:

CREATE FUNCTION dbo.Get_Proper_Cased_String
(@my_string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE
        @work_string    VARCHAR(MAX),
        @final_string   VARCHAR(MAX),
        @position       SMALLINT

    SET @final_string = ''
    SET @position = CHARINDEX(' ', @my_string)

    WHILE (@position > 0)
    BEGIN
        SET @work_string = LEFT(@my_string, @position - 1)

        IF (@work_string <> '')
            SET @final_string = @final_string + ' ' + UPPER(SUBSTRING(@work_string, 1, 1)) + LOWER(SUBSTRING(@work_string, 2, LEN(@work_string) - 1))

        SET @my_string = RIGHT(@my_string, LEN(@my_string) - @position)

        SET @position = CHARINDEX(' ', @my_string)
    END

    /* changed this to LTRIM to remove trailing space that was getting converted to underscore */
    SET @final_string = LTRIM (@final_string + ' ' + UPPER(SUBSTRING(@my_string, 1, 1)) + LOWER(SUBSTRING(@my_string, 2, LEN(@my_string) - 1)))

    RETURN @final_string
END
GO

SELECT
     'EXEC sp_rename ''' + O.name + '.' + C.name + ''', ''' + REPLACE(dbo.Get_Proper_Cased_String(REPLACE(C.name, '_', ' ')), ' ', '_') + ''', ''COLUMN'''
FROM
    sys.objects O
INNER JOIN sys.columns C ON
    C.object_id = O.object_id
WHERE
    O.object_id = OBJECT_ID('<table_name>')

此代码假定您仅有的非字符值是uu,并且没有连续的下划线,即“我的uuuu”列,则会给出错误的结果。

这几乎可以执行所有操作,但返回一个前导下划线EXEC sp_rename“Outlet.Outlet”、“u Outlet”,“COLUMN”@Tom H:将您的答案更改为包含LTRIM以删除前导空格。现在可以很好地工作了。除了返回一个前导下划线EXEC sp_rename'Outlet.Outlet','u Outlet','COLUMN',@Tom H:将您的答案更改为包含一个LTRIM以删除前导空格外,它几乎完成了所有操作。现在效果很好。