Невозможно получить доступ к временным таблицам из функции - PullRequest
18 голосов
/ 05 марта 2012

Я хотел бы получить количество конкретных записей.Поэтому мой запрос будет выглядеть следующим образом ...

SELECT
    ID, 
    NAME,
    (SELECT...) AS UserCount // Stmt1
FROM MyTable

Проблема в том, что 'Stmt1' - сложное утверждение, и его нельзя записать как innerquery.Ну, я могу использовать функции, но оператор включает «CREATE TABLE», поэтому я получаю следующее сообщение об ошибке

Cannot access temporary tables from within a function.

Каков наилучший способ выполнитьзадача?

Ответы [ 4 ]

23 голосов
/ 05 марта 2012

Вы можете использовать пользовательский тип таблицы для решения вашей проблемы.

Вы просто создаете табличную переменную, например

CREATE TYPE [dbo].[yourTypeName] AS TABLE(
    [columeName1] [int] NULL,
    [columeName2] [varchar](500) NULL,
    [columeName3] [varchar](1000) NULL
)
GO

, и вы можете объявить эту табличную переменную в своей функции как * 1006.*

    CREATE FUNCTION [dbo].[yourFunctionName] 
( 
    @fnVariable1 INT ,
    @yourTypeNameVariable yourTypeName READONLY
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 

    SELECT .................
        FROM @yourTypeNameVariable 
        WHERE ........
    RETURN @r 
END 

В вашей процедуре вы можете объявить тип вашей таблицы как

DECLARE @yourTypeNamevaribale AS yourTypeName 

И вы можете вставить значения в эту таблицу как

insert into @yourTypeNamevaribale (col,col,..)values(val,val,..)

передать это вашей функции как

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale )

пожалуйста, используйте этот метод, спасибо

3 голосов
/ 05 марта 2012

Да, вы не можете использовать #temp table.

Поскольку вы используете SQL Server 2008, почему бы вам не использовать табличную переменную вместо таблиц #temp? Попробуйте.

1 голос
/ 19 апреля 2013

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

Я бы не стал использовать табличные переменные, особенно если вы играете с большими наборами результатов, так как они хранятся в памяти. Смотрите этот пост ...

http://totogamboa.com/2010/12/03/speed-matters-subquery-vs-table-variable-vs-temporary-table/

Другие альтернативы будут ..

  1. Извлечение результата временной таблицы в другую табличную функцию.
  2. Преобразование кода в использование подзапросов
0 голосов
/ 21 декабря 2015

В 99,99% случаев нет необходимости использовать какие-либо приемы с временными таблицами или подзапросами, но используйте функции агрегирования, такие как COUNT, SUM или AVG в сочетании с OVER предложением и (часто) PARTITION BY.

Я не уверен, чего пытался достичь OP, но я предполагаю, что UserCount так или иначе связан со значениями в MyTable.Таким образом, должен быть способ присоединить MyTable к любой таблице, которая производит UserCount.

Самый простой пример - показать всех пользователей и общее количество пользователей

SELECT id
    , name
    , user_count = COUNT(*) OVER()
FROM MyUsers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...