【问题标题】:How to add temporary columns to list of columns in the select statement in SQL Server?如何在 SQL Server 的 select 语句中将临时列添加到列列表中?
【发布时间】:2020-09-02 12:19:12
【问题描述】:

我写了如下代码:

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;

谁能帮帮我?

【问题讨论】:

    标签: sql-server tsql multiple-columns


    【解决方案1】:

    只需在动态语句中添加额外的列。

    --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

    【讨论】:

    • 谢谢!也会执行您的建议。
    • 刚刚注意到您使用将@SampleTable 的值设置为'dbo.CourseType'。架构和表应该是不同的参数,会相应地调整我的答案。
    • 再次感谢。我刚刚开始使用动态sql。所以要经历很多试验和运行。
    • 那就给你一点无耻的自我推销吧,@astroluv:Dos and Don'ts of Dynamic SQL
    • 请注意,凭空提取的空值是int 缺失值。如果您想要不同的数据类型,您可以使用Cast( NULL as NVarChar(50) ) as ModifiedBy 来提供更合适的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多