A maioria dos outros bancos de dados permite gerar valores de tabela usando VALUES
. Tanto quanto posso dizer, o SQL Server permite fazer isso com subconsultas:
SELECT * FROM (
VALUES
('Cornelius','Eversoe', 'cornelius@example.net'),
('Ebenezer','Splodge', 'ebenezer@example.net'),
('Sylvester','Underbar', 'sylvester@example.net'),
('Cynthia','Hyphen-Smythe', 'cynthia@example.net')
) as sq(givenname,familyname,email);
mas não consigo fazê-lo funcionar com CTEs. O melhor que posso fazer é incorporar uma subconsulta dentro de um CTE:
WITH data AS (
SELECT * FROM (
VALUES
('Cornelius','Eversoe', 'cornelius@example.net'),
('Ebenezer','Splodge', 'ebenezer@example.net'),
('Sylvester','Underbar', 'sylvester@example.net'),
('Cynthia','Hyphen-Smythe', 'cynthia@example.net')
) as sq(givenname,familyname,email)
)
SELECT * FROM data;
Eu prefiro CTEs por causa de sua legibilidade, mas existe uma maneira mais direta de fazer isso? Por exemplo, PostgreSQL, MariaDB (versões de suporte) e SQLite aceitam isso:
WITH data(givenname,familyname,email) AS (
VALUES
('Cornelius','Eversoe', 'cornelius@example.net'),
('Ebenezer','Splodge', 'ebenezer@example.net'),
('Sylvester','Underbar', 'sylvester@example.net'),
('Cynthia','Hyphen-Smythe', 'cynthia@example.net')
)
SELECT * FROM data;
Não, o SQL Server atualmente oferece suporte apenas a construtores com valor de tabela em uma tabela derivada (ou a
VALUES
cláusula de umaINSERT ... VALUES
instrução). Portanto, você pode usarVALUES
em uma junção (incluindo aplicar) ou tabela derivada ("subconsulta"), mas não em uma expressão de tabela comum.Infelizmente, o T-SQL está atrasado em várias áreas em comparação com outros bancos de dados SQL populares, por exemplo, Adicionar suporte para construtores de valor de linha padrão ANSI .