Я хочу создать функцию, которая будет возвращать таблицу, извлекать строки с разными синонимами на основе @Parameter - PullRequest
0 голосов
/ 15 сентября 2011

Допустим, у меня есть 3 синонима

  • snTable1
  • snTable2
  • snTable3

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

fxFromTable (@FromDate, @ToDate, 'snTable1')  
  will return table from "Select * from snTable1 (@FromDate, @ToDate)" 

или

fxFromTable (@FromDate, @ToDate, 'snTable2')  
  will return table from "Select * from snTable2 (@FromDate, @ToDate)" 

или

fxFromTable (@FromDate, @ToDate, 'snTable3')  
  will return table from "Select * from snTable3 (@FromDate, @ToDate)" 

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

Вы можете создать встроенный TVF , используя UNION ALL.Последний параметр представляет тип источника.в плане выполнения вы увидите что-то приятное: вместо выполнения 3 операторов SELECT SQL Server выполнит только один оператор SELECT, в этом случае только последний SELECT:

StmtText
  |--Compute Scalar(DEFINE:([Union1007]=[AdventureWorks2008].[HumanResources].[Employee].[BusinessEntityID] as [e].[BusinessEntityID], [Union1008]=CONVERT_IMPLICIT(datetime,[AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate],0), [Union1009]=[AdventureWorks2008].[HumanResources].[Employee].[NationalIDNumber] as [e].[NationalIDNumber]))
       |--Clustered Index Scan(OBJECT:([AdventureWorks2008].[HumanResources].[Employee].[PK_Employee_BusinessEntityID] AS [e]), WHERE:([AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate]>='2003-01-01 00:00:00.000' AND [AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate]<='2003-12-31 00:00:00.000'))

Этот пример основан наБаза данных AdventureWorks2008.

0 голосов
/ 16 сентября 2011

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

  CREATE PROCEDURE TEST
  (
       @TableName VARCHAR(50),
       @FromDate  DATETIME,
       @ToDate    DATETIME
  )
  AS
  BEGIN
       EXEC('SELECT * FROM ' + @TableName + ' WHERE FromDate = '''+ @FromDate + ''' AND ToDate = ''' + @ToDate + ''')
  END

Если вы хотите использовать это в другой хранимой процедуре, вы можете сделать что-то вроде ниже:

 INSERT @temp EXECUTE TEST

Теперь @temp можно использовать как обычную временную таблицу.

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...