如何在SQL Server的select语句中向列列表中添加临时列?

问题描述

我写了以下代码,如下所示:

DECLARE @SQL nvarchar(max);
DECLARE @ColumnList nvarchar(max);
DECLARE @SampleTable nvarchar(max);

SET @SampleTable = 'dbo.CourseType' --HERE I'LL BE GIVING LIST OF TABLES

SELECT
    @ColumnList = (SELECT STUFF((SELECT N',' + QOUTENAME(c.name)
                                 FROM sys.columns c
                                 INNER JOIN sys.objects o ON c.object_id = o.object_id
                                 WHERE o.name = @SampleTable 
                                   AND c.name NOT IN ('ID','Number')
                                 ORDER BY c.column_id 
                                 FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)'),1,2,N'')) 

SELECT @ColumnList

从此脚本中,我将获得除列IDNumber之外的所有列的列表。现在,我要做的就是读取此列列表,即[Name],[Description],[SortOrder],[BusinessName],[Obsolete],下面列出了一些临时列:

NULL AS EntityID,NULL AS ModifiedBy,NULL AS CreatedBy

查询结果应如下所示:

Name         Description                        SortOrder   BusinessMeaningName         Obsolete   EntityID    ModifiedBy    CreatedBy
Inviern      Cursos de Invierno de Pregrado         1       AcademicPeriodType.Invierno    0         NULL       NULL          NULL
Lectivo      Cursos Lectivos de Pregrado            0       AcademicPeriodType.Lectivo     0         NULL       NULL          NULL
Verano       Cursos de Verano de Pregrado           1       AcademicPeriodType.Verano      0         NULL       NULL          NULL

我知道我可以直接通过为一两个表选择带有临时列的列名来直接执行此操作。但是我必须为一大堆桌子这样做。我想不出办法。

现在,我不知道如何在select语句中添加EntityID,CreatedBy,ModifiedBy。我试图做这样的事情。

SET @SQL = 'SELET '
            + @ColumnList
            + ' FROM ' + @SampleTable;
EXEC sp_executesql @SQL;

有人可以帮我吗?

解决方法

只需在动态语句中添加其他列即可。

--Dynamic object should be declared like this
DECLARE @SampleSchema sysname = N'dbo',@SampleTable sysname = N'CourseType';

SET @SQL = N'SELECT ' +
           @ColumnList +
           N',NULL AS EntityID,NULL AS ModifiedBy,NULL AS CreatedBy' +
           N' FROM ' + QUOTENAME(@SampleSchema) + N'.' + QUOTENAME(@SampleTable) + N';';
EXEC sys.sp_executesql @SQL;

此外,对象的名称只能包含255个字符,因此请勿将nvarchar(MAX)用作其数据类型。将@SampleTable声明为sysname

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...