SQL - Преобразование char в точную длину varchar - PullRequest
1 голос
/ 24 июня 2010

Я пытаюсь сделать что-то вроде этого:

SELECT CAST(MYCHARCOL AS VARCHAR(LEN(MYCHARCOL))) 
FROM MYTABLE

Как преобразовать столбец char в varchar, который является точной длиной данных внутри этого столбца char?

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Вы не можете сделать это

Попробуйте это

SELECT CAST(RTRIM(MYCHARCOL) AS VARCHAR(8000)) FROM MYTABLE
2 голосов
/ 24 июня 2010

Моей первой реакцией было то, почему кто-то хотел бы сделать это для себя?

Моей второй реакцией было думать, что это будет легко. Оказывается, установка длины не поддерживает переменные. Хотя следующий код может работать, я предлагаю вам спросить себя, почему вы пытаетесь выполнить эту операцию, и начать с этого.

BEGIN/*Char X to Varchar X   ==========================================================================================================*/


  USE msdb

  SELECT
    t.name
   ,c.name
   ,typ.name
   ,c.max_length
  FROM
    sys.tables t
    JOIN sys.columns c
      ON t.object_id = c.object_id
    JOIN sys.types typ
      ON c.user_type_id = typ.user_type_id
  WHERE
    typ.name IN ( N'varchar', N'nvarchar', N'char', N'nchar' )


  DECLARE @max_len INTEGER ;
  SELECT
    @max_len = c.max_length
  FROM
    sys.tables t
    JOIN sys.columns c
      ON t.object_id = c.object_id
    JOIN sys.types typ
      ON c.user_type_id = typ.user_type_id
  WHERE
    typ.name IN ( N'varchar', N'nvarchar', N'char', N'nchar' )
    AND t.name = N'backupset'
    AND OBJECT_SCHEMA_NAME(t.object_id) = N'dbo'
    AND c.name = N'type'



  --attempt 1
  SELECT
    as_a_char = bs.type
   ,hardcoded = CAST(bs.type AS VARCHAR(1))
    --, code_specified = CAST ( bs.type AS VARCHAR ( @max_len ) ) --When uncommented, Msg 102, Level 15, State 1, Line 33 - Incorrect syntax near '@max_len'.
  FROM
    msdb.dbo.backupset bs


  --attempt 2
  DECLARE @SQL NVARCHAR(MAX)
  SET @SQL = N'
  --attempt 1
  SELECT 
    as_a_char = bs.type
    , hardcoded = CAST ( bs.type AS VARCHAR(1) )
    , code_specified = CAST ( bs.type AS VARCHAR ( {@max_len} ) ) 
  FROM msdb.dbo.backupset bs
'

  SET @sql = REPLACE(@SQL, '{@max_len}', @max_len) ;

  EXECUTE ( @sql )

END/*Char X to Varchar X     ==========================================================================================================*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...