【问题标题】:Invalid Column name when executing stored procedure执行存储过程时列名无效
【发布时间】:2023-04-11 07:52:01
【问题描述】:

**`

这是我的脚本 - 当我执行这个存储过程时,我得到一个错误

列名无效

代码:

CREATE PROCEDURE EdilzSaf_Landing.test_hassan123 
    @x varchar(128),
    @y varchar(128)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql nvarchar(max);

    SET @sql= N'SELECT S.name as SchemaName,
                       T.name as TableName,
                       I.name as IndexName,
                       DDIPS.avg_fragmentation_in_percent
                FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS DDIPS
                INNER JOIN sys.tables T on T.object_id = DDIPS.object_id
                INNER JOIN sys.schemas S on T.schema_id = S.schema_id
                INNER JOIN sys.indexes I ON I.object_id = DDIPS.object_id
                                         AND DDIPS.index_id = I.index_id
                WHERE DDIPS.database_id = DB_ID()
                  AND I.name IS NOT NULL
                  AND S.Name = ' + QuoteName(@x) + '
                  AND T.Name = ' + QuoteName(@y) + '
                  AND DDIPS.avg_fragmentation_in_percent > 0
                ORDER BY DDIPS.avg_fragmentation_in_percent DESC'

    EXECUTE sp_executesql @sql
END

EXECUTE EdilzSaf_Landing.test_hassan123 @x='EdilzSAF_Landing', @y='BUNDLE'

【问题讨论】:

  • 很确定S.Name = '+QuoteName(@x)+' 没有做你认为的那样;所有sys 对象都没有名为EdilzSAF_LandingBUNDLE 的列。您确定在这里需要动态 SQL 吗?当然@x@y 应该是静态查询的参数,不是吗?
  • 同意,这不应该是动态的
  • 由于使用了无意义的参数名称而值得反对。
  • @SMor 同意了。人们需要停止这种大声笑

标签: sql-server azure stored-procedures


【解决方案1】:

Quotename 正在为您的姓名添加方括号并破坏您的 WHERE 子句(因为名称未使用方括号存储在系统表中)。

正如其他人在cmets中所说,这不需要动态sql。

declare @x varchar(128)='nsa', @y varchar(128)='Tasklist';

    set nocount on;
    declare @sql nvarchar(max);
    set @sql= N'
SELECT S.name as SchemaName,
T.name as TableName,
I.name as IndexName,
DDIPS.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS DDIPS
INNER JOIN sys.tables T on T.object_id = DDIPS.object_id
INNER JOIN sys.schemas S on T.schema_id = S.schema_id
INNER JOIN sys.indexes I ON I.object_id = DDIPS.object_id
AND DDIPS.index_id = I.index_id
WHERE DDIPS.database_id = DB_ID()
and I.name is not null
and S.Name = '''+@x+'''
and T.Name = '''+@y+'''
--AND DDIPS.avg_fragmentation_in_percent > 0
ORDER BY DDIPS.avg_fragmentation_in_percent desc
    '
     EXECUTE sp_executesql @sql
     select QuoteName(@x)
      select QuoteName(@y)
      select @sql

【讨论】:

    【解决方案2】:

    线索在这里的错误中,我无法复制,因为它是图像。您在查询中引用的sys 对象都没有名为EdilzSAF_LandingBUNDLE 的列。为什么要寻找这些列?那是因为这些条款:

    '...
    and S.Name = '+QuoteName(@x)+'
    and T.Name = '+QuoteName(@y)+'
    ...'
    

    这将解决:

    ...
    and S.Name = [EdilzSAF_Landing]
    and T.Name = [BUNDLE]
    ...
    

    这里不需要动态语句,使用参数化动态语句即可:

    CREATE PROCEDURE EdilzSaf_Landing.test_hassan123 @SchemaName sysname,
                                                     @TableName sysname
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT S.name AS SchemaName,
               T.name AS TableName,
               I.name AS IndexName,
               DDIPS.avg_fragmentation_in_percent
        FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) DDIPS
             INNER JOIN sys.tables T ON T.object_id = DDIPS.object_id
             INNER JOIN sys.schemas S ON T.schema_id = S.schema_id
             INNER JOIN sys.indexes I ON I.object_id = DDIPS.object_id
                                     AND DDIPS.index_id = I.index_id
        WHERE DDIPS.database_id = DB_ID()
          AND I.name IS NOT NULL
          AND S.name = @SchemaName
          AND T.name = @TableName
          AND DDIPS.avg_fragmentation_in_percent > 0
        ORDER BY DDIPS.avg_fragmentation_in_percent DESC;
    END;
    GO
    
    EXECUTE EdilzSaf_Landing.test_hassan123 @SchemaName = N'EdilzSAF_Landing',
                                            @TableName = N'BUNDLE';
    
    

    我还修复了您的 SP 参数的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多