2013-11-20 6 views
0

Я получаю сообщение об ошибке при выполнении следующего SQL-запроса.sql query - Недопустимое имя столбца

SELECT 
    RTRIM(name) AS [Segment Name], 
    growth,groupid AS [Group Id], 
    filename AS [File Name], 
    CAST(size/128.0 AS DECIMAL(10,2)) AS [Size in MB], 
    CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2)) AS [Space Used], 
    CAST(size/128.0-(FILEPROPERTY(name, 'SpaceUsed')/128.0) AS DECIMAL(10,2)) AS [Available Space], 
    CAST((CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) AS [Percent_Used] 
FROM 
    sysfiles 
WHERE 
    growth = 0 AND Percent_Used > 60 
ORDER BY 
    groupid DESC 

Ошибка говорит:

Msg 207, Level 16, State 1, Line 7
Неверное имя столбца 'PERCENT_USED'.

Зачем нужна эта ошибка ??

+0

я не знаю, а SQL-сервера, но как насчет удаления подчеркивания (как столбцов псевдонимов выше, кажется, работает отлично) – Asenar

+1

См [Logical обработка заказа оператора SELECT] (http://technet.microsoft.com/en-us/library/ms189499.aspx): «поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производные столбцы, определенные в этом разделе, не могут ссылаться на предшествующие статьи ... 4. WHERE ... 8. SELECT ... " –

ответ

4

Если вы видите логическую обработку запроса запроса, где предложение оценивается перед выбором. , чтобы заставить его работать, вам нужно использовать концепцию производных таблиц.

1. FROM 
2. ON 
3. OUTER 
4. **WHERE** 
5. GROUP BY 
6. CUBE | ROLLUP 
7. HAVING 
8. **SELECT** 

http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/

Select * from 
    (
     SELECT 
      RTRIM(name) AS [Segment Name], 
      growth,groupid AS [Group Id], 
      filename AS [File Name], 
      CAST(size/128.0 AS DECIMAL(10,2)) AS [Size in MB], 
      CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2)) AS [Space Used], 
      CAST(size/128.0-(FILEPROPERTY(name, 'SpaceUsed')/128.0) AS DECIMAL(10,2)) AS [Available Space], 
      CAST((CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) AS [Percent_Used] 
     FROM 
      sysfiles 
    ) DT 

     WHERE growth = 0 AND Percent_Used > 60 
     ORDER BY groupid DESC 
3

Вы пытаетесь использовать столбец, который вы определили для фильтрации в предложении WHERE. Этот столбец не существует в таблице sysfiles

Если вы хотите, вы можете обернуть эту SELECT в другом SELECT и сделать фильтрацию на последнем SELECT. Таким образом, столбец уже «существует».

0
WITH cte 
AS 
(
SELECT 
    RTRIM(name) AS [Segment Name], 
    growth,groupid AS [Group Id], 
    filename AS [File Name], 
    CAST(size/128.0 AS DECIMAL(10,2)) AS [Size in MB], 
    CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2)) AS [Space Used], 
    CAST(size/128.0-(FILEPROPERTY(name, 'SpaceUsed')/128.0) AS DECIMAL(10,2)) AS [Available Space], 
    CAST((CAST(FILEPROPERTY(name, 'SpaceUsed')/128.0 AS DECIMAL(10,2))/CAST(size/128.0 AS DECIMAL(10,2)))*100 AS DECIMAL(10,2)) AS [Percent_Used] 
FROM 
    sysfiles 
) 
SELECT * 
FROM cte 
WHERE 
    growth = 0 
    AND Percent_Used > 60 
ORDER BY [Group Id] DESC 
Смежные вопросы