【问题标题】:Why does the number of 'Rows affected' differ between a normal SELECT and a SELECT INTO?为什么正常 SELECT 和 SELECT INTO 的“受影响的行数”不同?
【发布时间】:2021-01-26 14:13:03
【问题描述】:

我的查询如下所示:

SELECT  
    OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema]
    ,T.[name] AS [Table], AC.[name] AS [Column]
    ,TY.[name] AS [Data Type]
    ,sep.[value] AS [Description]
    ,AC.[max_length] AS [Maximum Field Length]
    ,create_date AS [Date Created]
    ,modify_date AS [Date Modified]
    ,CASE WHEN is_identity = 1 THEN 'Yes' ELSE 'No' END AS [Primary Key]
    ,CASE WHEN AC.[is_nullable] = 1 THEN 'Yes' ELSE 'No' END AS [Allows Nulls]  
--  INTO 
--  tmp_desc
FROM sys.[tables] AS T   
    INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id]  
    INNER JOIN sys.[types] TY ON AC.[system_type_id] = TY.[system_type_id] AND AC.[user_type_id] = TY.[user_type_id]   
    left join sys.extended_properties sep on t.object_id = sep.major_id
                                         and ac.column_id = sep.minor_id
                                         and sep.name = 'MS_Description'
WHERE
    T.[is_ms_shipped] = 0

...列出我的表格和字段中的一些属性。

所以当我执行以下步骤时,会发生奇怪的事情:

  1. 我运行 SELECT,但尚未创建临时表(我运行了一个删除表以防万一):1018 条记录返回
  2. 我运行 SELECT INTO(在上面的代码中取消注释):1028 条记录受影响
  3. 我再次注释掉 INTO,暂时不要删除临时表,并且只选择:1028 条记录返回
  4. 我运行 'select * from tmp_desc':1028 条记录返回
  5. 我删除了临时表并再次运行 SELECT ONLY:1018 条记录返回

如果 tmp_desc 不是来自查询的一部分,那么创建临时表的任何想法都会影响从查询返回的行?

【问题讨论】:

    标签: sql sql-server tsql ssms


    【解决方案1】:

    tmp_desc 中存储的数据包括自身的详细信息;显然,当您只运行SELECT(没有INTO)时,它不会。因此,在运行纯 SELECT 后,INTO 会增加 10 行,因为表 tmp_desc 中有 10 列。

    db<>fiddle

    如果您希望查询“相同”,请使用 INTO 从查询中排除 tmp_desc

    SELECT S.[name] AS [Schema],
           T.[name] AS [Table],
           AC.[name] AS [Column],
           TY.[name] AS [Data Type],
           sep.[value] AS [Description],
           AC.[max_length] AS [Maximum Field Length],
           create_date AS [Date Created],
           modify_date AS [Date Modified],
           CASE WHEN is_identity = 1 THEN 'Yes' ELSE 'No' END AS [Primary Key],
           CASE WHEN AC.[is_nullable] = 1 THEN 'Yes' ELSE 'No' END AS [Allows Nulls]
    INTO tmp_desc
    FROM sys.schemas S
         INNER JOIN sys.[tables] T ON S.schema_id = T.schema_id
         INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id]
         INNER JOIN sys.[types] TY ON AC.[system_type_id] = TY.[system_type_id]
                                  AND AC.[user_type_id] = TY.[user_type_id]
         LEFT JOIN sys.extended_properties sep ON T.object_id = sep.major_id
                                              AND AC.column_id = sep.minor_id
                                              AND sep.name = 'MS_Description'
    WHERE T.[is_ms_shipped] = 0
      AND NOT(S.[name] = N'dbo' AND T.[name] = 'tmp_desc');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      相关资源
      最近更新 更多