Как заменить табличную переменную в T-SQL 2008 строковое соединение - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть UDF, работающий в SQL 2000, который использует таблицу var для возврата строки с разделителями-запятыми из нескольких строк данных:

CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN
      DECLARE @TaskNoTable table
         (  TaskNo varchar (15)  )
      DECLARE @TaskList varchar(1000)
      SET @TaskList = ''
      INSERT INTO @TaskNoTable
         SELECT TaskNo
         FROM MainlinePlanTask
         WHERE MainlinePlanID = @MainlinePlanID
      IF @@ROWCOUNT > 0
         UPDATE @TaskNoTable
            SET @TaskList = ( @TaskList + TaskNo + ', ' )
      RETURN substring( @TaskList, 1, ( len( @TaskList ) - 1 ))
   END

Возможно ли заменить код таблицы var на что-то более быстрое сейчас?что он работает на SQL 2008?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

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

Из статьи:

Вот очень простой пример t-sql, использующий FOR XML PATH () для объединения значений строк SQL в качестве примера объединения SQLв MSSQL.

SELECT
  STUFF(
    (
    SELECT
      ' ' + Description
    FROM dbo.Brands
    FOR XML PATH('')
    ), 1, 1, ''
  ) As concatenated_string

Ваша обновленная функция может выглядеть примерно так:

CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN

    RETURN
      SELECT STUFF((
    SELECT
      TaskNo + ', '
    FROM MainlinePlanTask
    WHERE MainlinePlanID = @MainlinePlanID
    FOR XML PATH('')
    ), 1, 0, ''
  ) As concatenated_string

   END
0 голосов
/ 14 апреля 2011
CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN
      DECLARE @TaskList varchar(1000)

      SET @TaskList = ''

      SELECT @TaskList = ( @TaskList + TaskNo + ', ' )
      FROM MainlinePlanTask
      WHERE MainlinePlanID = @MainlinePlanID

      RETURN substring( @TaskList, 1, ( len( @TaskList ) - 1 ))
   END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...