【问题标题】:The multi-part identifier could not be bound sql for query spanning multiple tables无法为跨多个表的查询绑定多部分标识符
【发布时间】:2014-03-13 16:34:19
【问题描述】:

我继承了一个需要为多个项目修改的存储过程,并且遇到了这个多部分标识符错误消息:

The multi-part identifier "schema.tablename" could not be bound

schema 是我在数据库中使用的架构,当然 tablename 是单个表名。

这是我的 Sql 查询:

   CREATE TABLE #Results (TableNames nvarchar(50), ColumnContent nvarchar(250), Count int)
   SET NOCOUNT ON
   DECLARE @TableName nvarchar(256)
   SET  @TableName = ''
   WHILE @TableName IS NOT NULL
   BEGIN
          SET @TableName =
          (
                 SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                 FROM INFORMATION_SCHEMA.TABLES
                 WHERE TABLE_TYPE = 'BASE TABLE'
                       AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                       AND    OBJECTPROPERTY(
                                     OBJECT_ID(
                                            QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                            ), 'IsMSShipped'
                                            ) = 0
          )
          WHILE (@TableName IS NOT NULL)
          BEGIN

               INSERT INTO #Results
               EXEC
               (
                      'SELECT ' + @TableName + ',[Column5], COUNT(*) FROM '+ @TableName +' ORDER BY NEWID()'
               )

          END   
   END
  SELECT * FROM #Results
  DROP TABLE #Results

基本上我想搜索所有表,并为每个表存储表名、指定列的不同内容以及这些不同列值的计数。非常感谢任何帮助以查看我的问题所在。

【问题讨论】:

  • 我猜这是罪魁祸首:'SELECT ' + @TableName + ',[Column5], COUNT(*) FROM '+ @TableName +' ORDER BY NEWID()' proc 正试图将 Schema.TableName 显示为结果集中的列,对吧?我会试试这个:'SELECT ''' + @TableName + ''',[Column5], COUNT(*) FROM '+ @TableName +' ORDER BY NEWID()'
  • 我现在得到msg 8120 -Column 'schema.tablename.columnname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 显然我有很多问题。我将如何获得随机部分 (NEWID()) 以及对 `GROUP BY' 的明显需求?
  • 我本来想从表中随机抽样,所以查询最初看起来像这样:SELECT TOP 100 tablename, columnname, COUNT(*) FROM tablename ORDER BY NEWID()
  • 好的,所以我按问题确定了分组和排序。我这样做了:group by columnname order by 2 desc.
  • @DMason 如果您将您的建议设置为答案,我会接受。再次感谢!

标签: sql sql-server


【解决方案1】:

我猜这是罪魁祸首:

INSERT INTO #Results
    EXEC
    (
        'SELECT ' + @TableName + ',[Column5], COUNT(*) FROM '+ @TableName +' ORDER BY NEWID()'
    ) 

我会试试这个:

INSERT INTO #Results
    EXEC
    (
        'SELECT ''' + @TableName + ''',[Column5], COUNT(*) FROM '+ @TableName +' GROUP BY [Column5] ORDER BY NEWID()'
    )

【讨论】:

    【解决方案2】:

    试试这个。另外,我注意到您的第二个 while 循环永远不会结束。我把它改成了 IF

     CREATE TABLE #Results (TableNames nvarchar(50), ColumnContent nvarchar(250), Count int)
       SET NOCOUNT ON
       DECLARE @TableName nvarchar(256)
       SET  @TableName = ''
       WHILE @TableName IS NOT NULL
       BEGIN
              SET @TableName =
              (
                     SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                     FROM INFORMATION_SCHEMA.TABLES
                     WHERE TABLE_TYPE = 'BASE TABLE'
                           AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                           AND    OBJECTPROPERTY(
                                         OBJECT_ID(
                                                QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                                ), 'IsMSShipped'
                                                ) = 0
              )
              print @Tablename
              IF (@TableName IS NOT NULL)
              BEGIN
    
                   INSERT INTO #Results
                   EXEC
                   (
                           'SELECT ''' + @TableName + ''', [Column5],COUNT(*) FROM '+ @TableName 
                   )
    
              END   
       END
      SELECT * FROM #Results`enter code here`
    

    【讨论】:

    • 谢谢!!我没有抓住那个!太专注于其他事情了。
    • 这并不能解决我的其他问题,但它确实解决了明显的无限循环问题
    • 完全错过了。复制粘贴综合症...所以我使用了一个变量来打印动态语句,并在修复错误后,为了将代码恢复到您的版本,我复制了一些您的原始代码并且错过了再次修复引号。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多