Mi mesa:

id    name    city
--------------------
1     Jim     NewYork
2     Rose    London
3     Kitty   Seattle
......

La salida:

id    name    city
--------------------
id    name    city
1     Jim     NewYork
2     Rose    London
3     Kitty   Seattle

Puedo hacerlo fácilmente en SQL estático como this, pero ¿cómo hacerlo en SQL dinámico?

Declare @sql as varchar(max)='select *';
set @sql =@sql+' from mytable';

exec(@sql)
0
user618520 13 feb. 2020 a las 10:38

2 respuestas

La mejor respuesta

No estoy seguro de por qué quieres hacer eso, ya que tu identificación me parece int. Si desea que aparezca un valor de tipo de cadena adicional en la columna en la parte superior, en ese caso debe convertir todo el int a cadena.

Aún así, si desea hacerlo, puede escribir su consulta de la siguiente manera.

SELECT *
FROM (
    SELECT cast(id AS VARCHAR(10)) AS id
        ,Name
        ,city
    FROM mytable

    UNION ALL

    SELECT 'id'
        ,'name'
        ,'city'
    ) t
ORDER BY CASE 
        WHEN t.id = 'id'
            THEN 0
        ELSE 1
        END

La misma consulta se puede escribir como consulta dinámica como la siguiente.

DECLARE @sql AS VARCHAR(max) = 'select * from (
                select cast(id as varchar(10)) as id,Name,city';
SET @sql = @sql + ' from mytable union select ''id'',''name'', ''city'')t 
                      order by case when t.id=''id'' then 0 else 1 end';

EXEC (@sql)
1
PSK 13 feb. 2020 a las 07:48

No sé si estoy exagerando. Pero si quieres una forma puramente dinámica, puedes probar algo como

declare @sql varchar(max),
    @colnameHeads varchar(max), 
    @colnames varchar(max);

-- building the row with column headers
set @colnameHeads   = STUFF((
SELECT ',''' + COLUMN_NAME + ''''
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'<your-table>'
FOR XML PATH('')
), 1, 1, '')

-- casting all the values to varchar to match with header row
set @colnames   = STUFF((
SELECT ',' +  CONCAT('CAST(', COLUMN_NAME, ' AS VARCHAR(100))')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'<your-table>'
FOR XML PATH('')
), 1, 1, '')

-- dynamic script
set  @sql  = 'select '+ @colnameHeads  + ' union all select '+ @colnames + ' from <your-table>';

EXEC (@sql)
0
an33sh 13 feb. 2020 a las 08:05