T- SQL Имя таблицы в качестве параметра - PullRequest
1 голос
/ 16 апреля 2020

У меня был этот код, который плохо масштабируется, поскольку имя таблицы жестко закодировано. Буду признателен за идеи о том, как его реорганизовать.

CREATE FUNCTION [dbo].[GetIntRowVersion] (@Id INT, @Table NVARCHAR(128)) RETURNS BINARY(8) AS
BEGIN
DECLARE @rowVersion AS BINARY(8)
   IF @Id = 0
      SELECT @rowVersion = 
      CASE
         WHEN @Table = 'Score' THEN (SELECT MAX([RowVersion]) FROM Score) 
         WHEN @Table = 'Department' THEN (SELECT MAX([RowVersion]) FROM Department)
         WHEN @Table = 'ContactType' THEN (SELECT MAX([RowVersion]) FROM ContactType)
         WHEN @Table = 'Region' THEN (SELECT MAX([RowVersion]) FROM Region)
      END
   ELSE
      SELECT @rowVersion = 
      CASE
         WHEN @Table = 'Score' THEN (SELECT TOP 1 [RowVersion] FROM Score WHERE Id = @Id) 
         WHEN @Table = 'Department' THEN (SELECT TOP 1 [RowVersion] FROM Department WHERE Id = @Id)
         WHEN @Table = 'ContactType' THEN (SELECT TOP 1 [RowVersion] FROM ContactType WHERE Id = @Id)
         WHEN @Table = 'Region' THEN (SELECT TOP 1 [RowVersion] FROM Region WHERE Id = @Id)
      END
RETURN @rowVersion
END

GO

1 Ответ

1 голос
/ 16 апреля 2020

Примерно так:

CREATE PROCEDURE [dbo].[GetIntRowVersion] 
(
    @Id INT
   ,@Table NVARCHAR(128)
)
AS
BEGIN;

    SET NOCOUNT ON;

    DECLARE @rowVersion AS BINARY(8);

    DECLARE @DynamicTSQL NVARCHAR(MAX);

    IF @Id = 0 
        BEGIN;
            SET @DynamicTSQL = N'SELECT @rowVersion =   (SELECT MAX([RowVersion]) FROM ' + @Table + ')';
        END;
    ELSE
        BEGIN;
            SET @DynamicTSQL = N'SELECT @rowVersion =  (SELECT TOP 1 [RowVersion] FROM ' + quotename (@Table) + ' WHERE Id = ' + CAST(@Id AS VARCHAR(12)) +');';
        END;

    EXEC sp_executesql @DynamicTSQL, N'@rowVersion AS BINARY(8) OUTPUT', @rowVersion = @rowVersion OUTPUT;

    SELECT @rowVersion AS[rowVersion];

    SET NOCOUNT OFF;

    RETURN;
END;

Вам необходимо использовать хранимую процедуру, поскольку функциям не разрешено выполнять CRUD операции над SQL таблицами и выполнять динамические c T- SQL операторы (если не являются SQL функциями CLR).

Вы также можете использовать OUTPUT параметр процедуры.

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