AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 158360
Accepted
McNets
McNets
Asked: 2016-12-17 04:00:38 +0800 CST2016-12-17 04:00:38 +0800 CST 2016-12-17 04:00:38 +0800 CST

Existe uma maneira de usar a função interna sysconv ()?

  • 772

Se você obtiver a definição de algumas visualizações usando sys.sp_helptext:

exec sys.sp_helptext 'sys.columns'

CREATE VIEW sys.columns
AS
  SELECT c.id                                                             AS object_id,
         c.NAME,
         c.colid                                                          AS column_id,
         c.xtype                                                          AS system_type_id,
         c.utype                                                          AS user_type_id,
         c.length                                                         AS max_length,
         c.prec                                                           AS PRECISION,
         c.scale,
         CONVERT(SYSNAME, CollationPropertyFromId(c.collationid, 'name')) AS collation_name,
         sysconv(bit, 1 - ( c.status & 1 ))                               AS is_nullable,-- CPM_NOTNULL  
         sysconv(bit, c.status & 2)                                       AS is_ansi_padded,-- CPM_NOTRIM  
         sysconv(bit, c.status & 8)                                       AS is_rowguidcol,-- CPM_ROWGUIDCOL  
         sysconv(bit, c.status & 4)                                       AS is_identity,-- CPM_IDENTCOL  
         sysconv(bit, c.status & 16)                                      AS is_computed,-- CPM_COMPUTED  
         sysconv(bit, c.status & 32)                                      AS is_filestream,-- CPM_FILESTREAM  
         sysconv(bit, c.status & 0x020000)                                AS is_replicated,-- CPM_REPLICAT  
         sysconv(bit, c.status & 0x040000)                                AS is_non_sql_subscribed,-- CPM_NONSQSSUB  
         sysconv(bit, c.status & 0x080000)                                AS is_merge_published,-- CPM_MERGEREPL  
         sysconv(bit, c.status & 0x100000)                                AS is_dts_replicated,-- CPM_REPLDTS  
         sysconv(bit, c.status & 2048)                                    AS is_xml_document,-- CPM_XML_DOC   
         c.xmlns                                                          AS xml_collection_id,
         c.dflt                                                           AS default_object_id,
         c.chk                                                            AS rule_object_id,
         sysconv(bit, c.status & 0x1000000)                               AS is_sparse,-- CPM_SPARSE  
         sysconv(bit, c.status & 0x2000000)                               AS is_column_set -- CPM_SPARSECOLUMNSET  
  FROM   sys.syscolpars c
  WHERE  number = 0
         AND has_access('CO', c.id) = 1 

Existe uma função chamada sysconv.

A função 'sysconv' é usada por essas exibições e você pode selecionar valores dessa exibição sem obter nenhuma mensagem de erro.

select * from sys.columns;

Mas se eu tentar algo parecido com:

select sysconv(bit, 375 & 8);

Eu recebo o erro:

sysconv não é um nome de função integrado reconhecido

Como Martin Smith apontou, essa função pode ser substituída por convert (bit, 375 & 8), mas eu me pergunto por que posso selecionar valores dessa visão e não posso usá-la em minhas consultas, mesmo quando o SSMS a reconhece como comando, alterando a cor do primeiro plano?

sql-server t-sql
  • 1 1 respostas
  • 963 Views

1 respostas

  • Voted
  1. Best Answer
    John K. N.
    2016-12-17T07:34:03+08:002016-12-17T07:34:03+08:00

    A visualização sys.columns é uma visualização do sistema. Essa exibição é fornecida a você pelo usuário sys no banco de dados mestre, que é um usuário do banco de dados sem login.

    O usuário sys tem seu próprio esquema sys, que é usado para vincular todos os objetos sys.*.

    As permissões para selecionar objetos sys.* são concedidas a você por meio da associação na função pública do SQL Server. A função pública do SQL Server tem permissões SELECT em todos os objetos de esquema sys.*.

    É assim que você recebe permissão para select * from sys.columns.

    Se você não for membro da função de servidor público, não terá acesso a nenhum dos objetos sys.*.

    usuário sys (script)

    USE [master]
    GO
    
    /****** Object:  User [sys]    Script Date: 16.12.2016 15:57:08 ******/
    CREATE USER [sys]
    GO
    

    esquema sys (script)

    USE [master]
    GO
    
    /****** Object:  Schema [sys]    Script Date: 16.12.2016 15:57:35 ******/
    CREATE SCHEMA [sys]
    GO
    

    função de servidor público (script)

    USE [master]
    GO
    
    /****** Object:  ServerRole [public]    Script Date: 16.12.2016 16:05:05 ******/
    CREATE SERVER ROLE [public]
    GO
    

    Função de banco de dados público

    Há também uma publicfunção de banco de dados, que está de alguma forma vinculada à função de servidor. Se você consultar a sys.database_principals(exibição) no banco de dados mestre, verá que existe um publicprincipal com o mesmo id da função de servidor publicque é 0. Presumo que este seja o elo perdido, entre o database_role public e o server_role público.

    Editar: Adicionadas algumas informações sobre a função de banco de dados "público"

    A função pública está contida em cada banco de dados, que inclui bancos de dados do sistema. Ele não pode ser descartado e você não pode adicionar ou remover usuários dele. As permissões concedidas à função pública são herdadas por todos os outros usuários e funções porque pertencem à função pública por padrão. Conceda publicamente apenas as permissões que você deseja que todos os usuários tenham.

    Citação de funções de servidor e banco de dados no SQL Server , seção: "A função pública"

    Se você recuperar as permissões para a função de banco de dados publicno banco de dados mestre, obterá a seguinte listagem:

    Consulta:

    SELECT 
       OBJECT_NAME(dp.major_id) AS OBJECT , 
       USER_NAME(dp.grantee_principal_id) AS grantee, 
       USER_NAME(dp.grantor_principal_id) AS grantor, 
      dp.permission_name
    FROM sys.database_permissions AS dp 
    WHERE dp.grantee_principal_id = 0
    

    Resultados:

    sp_MSalreadyhavegeneration  public dbo EXECUTE
    sp_MSwritemergeperfcounter  public dbo EXECUTE
    TABLE_PRIVILEGES            public dbo SELECT
    sp_replsetsyncstatus        public dbo EXECUTE
    sp_replshowcmds             public dbo EXECUTE
    sp_publishdb                public dbo EXECUTE
    dm_pdw_nodes_os_tasks       public dbo SELECT
    ...
    [truncated]
    

    Voltando ao seu exemplo com a exibição sys.colums: Você recebeu permissões para SELECT na exibição, mas não tem permissões para executar a função sysconv diretamente, que é a definição de uma coluna no conjunto de resultados . Ele foi escondido de seus olhos curiosos.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve