none
Criação de Tabela Temporária com Collate RRS feed

  • Pergunta

  • Pessoal estou desenvolvendo uma stored procedure que alimenta uma tabela temporária onde cada campo recebe informação de diversas tabelas, os campos são do tipo varchar, porém gostaria de saber se é possível capturar o collate da tabela física e criar minha tabela temporária com base nesse collate?
    quarta-feira, 28 de agosto de 2013 13:59

Respostas

  • Eder,

    Para trabalhar desta forma terás que usar SQL dinamico.

    ex:

    declare @collate varchar(100)
    select @collate = c.collation_name
    --t.name as tabela, c.name as coluna, c.collation_name, ty.name,  c.max_length
    from sys.columns as c
    inner join sys.tables as t on c.object_id = t.object_id
    inner join sys.types as ty on c.system_type_id = ty.system_type_id
    where t.name = 'tbProduto'
    and c.collation_name is not null

    --select @collate

    declare @tab nvarchar(max)
    set @tab = 'create table #tmp ( id int , strname varchar(50) COLLATE ' + @collate + ' null);'
    set @tab += 'insert into #tmp (id, strname) values (1, ''teste'');'
    set @tab += 'select * from #tmp;'
    set @tab += 'DROP TABLE  #tmp;'

    exec sp_executesql @tab 

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    quarta-feira, 28 de agosto de 2013 15:18

Todas as Respostas

  • Olá Eder,

    Para capturar o collation de suas tabelas vc pode executar esta consulta:

    select t.name as tabela, c.name as coluna, c.collation_name  
    from sys.columns as c
    inner join sys.tables as t on c.object_id = t.object_id
    where t.type = 'U'
    and c.collation_name is not null

    Para criação da tabela temporária com collate ficaria assim:

    create table #tmp ( id int , strname varchar(50) collate Latin1_General_CI_AS null)
    insert into #tmp (id, strname) values (1, 'teste');
    select * from #tmp;
    drop table #tmp

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    quarta-feira, 28 de agosto de 2013 14:18
  • Bacana só uma dúvida por exemplo eu queria jogar o valor do collate em uma variável e durante a criação no lugar de colocar collate Latin1_General_CI_AS eu queria colocar collate variavel tem como?
    quarta-feira, 28 de agosto de 2013 14:50
  • Olá Eder,

    Você pode fazer assim:

    declare @collate varchar(100)
    select @collate = c.collation_name
    --t.name as tabela, c.name as coluna, c.collation_name, ty.name,  c.max_length
    from sys.columns as c
    inner join sys.tables as t on c.object_id = t.object_id
    inner join sys.types as ty on c.system_type_id = ty.system_type_id
    where t.name = 'tbProduto'
    and c.collation_name is not null

    select @collate

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão quarta-feira, 28 de agosto de 2013 14:58
    quarta-feira, 28 de agosto de 2013 14:58
  • por exemplo fiz assim:

    DECLARE @COLECAO AS VARCHAR(50);
    SET @COLECAO = '';
    select @COLECAO = c.collation_name   
    from sys.columns as c, sys.tables as t
    where t.type = 'U'
    and c.collation_name is not null
    AND c.object_id = t.object_id
    AND T.name = 'IN_USUARIO'
    AND C.NAME = 'CARTAO'
    


    dai queria criar uma tabela assim:

    create table #tmp ( id int , strname varchar(50) @colecao null)
    insert into #tmp (id, strname) values (1, 'teste');
    select * from #tmp;
    

    No caso o @colecao queria que fosse a informação do meu collate tem como fazer isso?

    quarta-feira, 28 de agosto de 2013 15:02
  • Eder,

    Para trabalhar desta forma terás que usar SQL dinamico.

    ex:

    declare @collate varchar(100)
    select @collate = c.collation_name
    --t.name as tabela, c.name as coluna, c.collation_name, ty.name,  c.max_length
    from sys.columns as c
    inner join sys.tables as t on c.object_id = t.object_id
    inner join sys.types as ty on c.system_type_id = ty.system_type_id
    where t.name = 'tbProduto'
    and c.collation_name is not null

    --select @collate

    declare @tab nvarchar(max)
    set @tab = 'create table #tmp ( id int , strname varchar(50) COLLATE ' + @collate + ' null);'
    set @tab += 'insert into #tmp (id, strname) values (1, ''teste'');'
    set @tab += 'select * from #tmp;'
    set @tab += 'DROP TABLE  #tmp;'

    exec sp_executesql @tab 

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    quarta-feira, 28 de agosto de 2013 15:18