Обходной путь для выполнения Dynami c sql в функции - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать представление, которое динамически генерирует текст из входных параметров. Но выполнение Dynami c sql или хранимой процедуры не допускается в функциях. Есть ли способ обойти это?

Я работаю на SQL Server 2014 Windows 10

Ниже приведен пример сценария для:

  1. Создать таблицы
    • Emp_info содержит данные о сотруднике.
    • Table_list содержит информацию о таблицах со столбцом table_template_id.
    • table_template_id содержит формат данных, отображаемых в представлении. Это можно настроить.
  2. Создать функцию
    • Принимает 2 входных параметра (table_key и emp_key для получения отформатированного table_template_id)
  3. Создать представление
  4. Ожидаемый результат
----------------1. TABLES-------------------------
IF OBJECT_ID('dbo.emp_info', 'U') IS NOT NULL
DROP TABLE dbo.emp_info;
CREATE TABLE emp_info (emp_key INT, table_key INT, emp_fname NVARCHAR(100), emp_lname NVARCHAR(100), city_name NVARCHAR(100), city_zip BIGINT)
INSERT INTO emp_info (emp_key, table_key, emp_fname, emp_lname, city_name, city_zip) VALUES (1, 3, 'Brad', 'Pitt', 'San Jose', 95670)
INSERT INTO emp_info (emp_key, table_key, emp_fname, emp_lname, city_name, city_zip) VALUES (2, 3, 'Will', 'Smith', 'Kansas', 65870)

IF OBJECT_ID('dbo.table_list', 'U') IS NOT NULL
DROP TABLE dbo.table_list;
CREATE TABLE table_list (table_key int, table_name NVARCHAR(100), table_template_id NVARCHAR(100))
INSERT INTO table_list (table_key, table_name, table_template_id) VALUES (3, 'emp_info', '[emp_lname],[emp_fname]-[empkey]')
----------------TABLES-------------------------
----------------2. FUNCTION-------------------------
IF OBJECT_ID(N'crt_emp_temp_id', N'FN') IS NOT NULL
    DROP FUNCTION crt_emp_temp_id
GO
CREATE FUNCTION crt_emp_temp_id (@table_key INT, @emp_key INT)
RETURNS NVARCHAR(1000)
AS
 BEGIN

DECLARE @mi_table_id_tmp TABLE (
table_key BIGINT,
table_fld NVARCHAR(100),
fld_order BIGINT
)

DECLARE @table_template_id NVARCHAR(100), @table_fld NVARCHAR(100), @table_flds NVARCHAR(100),
@count INT = 0, @max_fld_order INT, @table_name NVARCHAR(100),
@fld_order INT, @sql_stmt NVARCHAR(MAX), @out_value NVARCHAR(1000)

SELECT @table_template_id = table_template_id
     ,@table_name = table_name
FROM table_list
WHERE table_key = @table_key

SET @table_flds = @table_template_id

WHILE (LEN(@table_flds) > 0)
BEGIN
 SET @table_fld = SUBSTRING(@table_flds, CHARINDEX('[', @table_flds)+1, CHARINDEX(']', @table_flds)-2)
 SET @table_flds = SUBSTRING(@table_flds, CHARINDEX(@table_fld, @table_flds)+LEN(@table_fld)+1, LEN(@table_flds));
 SET @table_flds = SUBSTRING(@table_flds, CHARINDEX('[', @table_flds ), LEN(@table_flds))

 SET @count = @count + 1;
 INSERT INTO @mi_table_id_tmp (table_key, table_fld, fld_order) VALUES (@table_key, @table_fld, @count);  
END

SELECT @max_fld_order = MAX(fld_order) FROM @mi_table_id_tmp

SET @count = 1

WHILE (@count <= @max_fld_order)
BEGIN
    SELECT top(1) @table_fld = table_fld
    FROM @mi_table_id_tmp
    WHERE fld_order = @count

    IF (@count = 1)
        SET @table_template_id = REPLACE(@table_template_id, '['+@table_fld+']', @table_fld+'+''')
    ELSE IF (@count = @max_fld_order)
        SET @table_template_id = REPLACE(@table_template_id, '['+@table_fld+']', '''+'+@table_fld);
    ELSE
        SET @table_template_id = REPLACE(@table_template_id, '['+@table_fld+']', '''+'+@table_fld+'+''');

    SET @count = @count + 1
END

SET @sql_stmt = 'select @out = '+@table_template_id+' from '+@table_name+' where emp_key = @e_k'

------------This is where I'm stuck-------------------
EXECUTE sp_executesql @sql_stmt, N'@e_k int,@out NVARCHAR(1000) OUTPUT', @e_k = @emp_key, @out = @out_value OUTPUT
RETURN @out_value
------------This is where I'm stuck-------------------
 END
GO
----------------FUNCTION-------------------------
----------------3. VIEW-------------------------
IF object_id(N'emp_info_vw', N'V') IS NOT NULL
    DROP FUNCTION emp_info_vw
GO
CREATE VIEW emp_info_vw AS
SELECT crt_emp_temp_id (table_key, emp_key) emp_id,
city_name,
city_zip
FROM emp_info
GO
----------------VIEW-------------------------
--------------4. Expected Output----------------
/*
I'd like to have my output of the view as below
Pitt,Brad-1   San Jose  95670
Smith,Will-2  Kansas    65870
*/
--------------Expected Output----------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...