Создание проверки SQL для различных условий, полученных из другой таблицы - PullRequest
0 голосов
/ 23 октября 2018

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

Таблица настроек будет иметь 2 столбца, например:

+------------------------+--------------------------------------------------+
|      Description       |                     Criteria                     |
+------------------------+--------------------------------------------------+
| Missing birth country  |  from stu where bcu = ''                         |
| Email invalid          |  from con where em not like '%@%.%' and em <> '' |
+------------------------+--------------------------------------------------+

представление об ошибках выглядело бы просто как две колонки, как это (примечание ID - это идентификатор студента, для иллюстрации может быть просто любое число)

+------+------------------------+
|  ID  |          Error         |
+------+------------------------+
| 123  |  Email invalid         |
| 123  |  Missing birth country |
| 234  |  Email invalid         |
+------+------------------------+
etc...

Это то, что я до сих пор имел для представления SQL.Как я могу создать динамическое представление для извлечения этих настроек из таблицы настроек?

--missing birth country
select id,
'Missing birth country.' as err
from stu where bcu = '' and del = 0

union all

--invalid email format
select id,
'Email invalid format in Contacts' as err
from con where em not like '%@%.%' and em <> '' and del = 0

Обратите внимание, что это с MS SQL Server, и я бы предпочел решение, которое работает с 2008+, но также открыто для различных вариантов.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Создайте хранимую процедуру следующим образом (я получил помощь по коду @ The_Player):

CREATE PROCEDURE [dbo].[testPrc]
AS
set nocount on
SET FMTONLY OFF
BEGIN
DECLARE @SQL NVARCHAR(max)

SET @SQL = N''

SELECT
@SQL = @SQL + 'SELECT id, '''+ Description + ''' as err ' + Criteria         +CHAR(13)+CHAR(10)+'UNION ALL'+CHAR(13)+CHAR(10)
FROM settings

SET @SQL = LEFT(@SQL, LEN(@SQL) - 11)
PRINT @SQL
EXEC sp_executesql @SQL

END  

Выполните следующие команды:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO  

Создайте представление в виде:

CREATE VIEW [dbo].[testView]
AS
SELECT        ID, err
FROM            OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 
'exec TestDB.dbo.testPrc WITH RESULT SETS (  (    ID INT,   err VARCHAR(150)   )  ) 
') AS derivedtbl_1
GO  

Отредактировано:
Второе решение без хранимой процедуры:

CREATE VIEW [dbo].[testView2]
AS
SELECT ID, err
FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 
'EXECUTE sp_executesql   
N''SELECT
@SQL = @SQL + ''''SELECT id, ''''+''''''''''''''''+ Description +     ''''''''''''''''+'''' as err '''' + Criteria +CHAR(13)+CHAR(10)+''''UNION     ALL''''+CHAR(13)+CHAR(10)
FROM TestDB.dbo.settings
SET @SQL = LEFT(@SQL, LEN(@SQL) - 11)
EXEC sp_executesql @SQL
WITH RESULT SETS (  (    ID INT,   err VARCHAR(150)   )  ) 
'',  
N''@SQL NVARCHAR(max)'',  
@SQL = N'''' 
WITH RESULT SETS (  (    ID INT,   err VARCHAR(150)   )  )' ) AS     derivedtbl_1
GO  

Всего несколько точек
Вы должны добавить имя базы данных и имя схемы в начале имени таблицы.
Например:

from stu where bcu = ''  

должно быть:

from TestDB.dbo.stu where bcu = ''
0 голосов
/ 23 октября 2018

Это работает:

DECLARE @SQL NVARCHAR(max)

SET @SQL = N''

SELECT
    @SQL = @SQL + 'SELECT id, '''+ Description + ''' as err ' + Criteria +CHAR(13)+CHAR(10)+'UNION ALL'+CHAR(13)+CHAR(10)
FROM settings

SET @SQL = LEFT(@SQL, LEN(@SQL) - 11)
PRINT @SQL
EXEC sp_executesql @SQL

Вероятно, вы должны улучшить его, экранируя символы в строках описания, но это основной ответ на ваш вопрос.


Редактировать: используя OPкомментарий для создания табличной функции и представление, которое ее вызывает.

CREATE FUNCTION dbo.tvf_getErrors
   RETURNS  TABLE  AS

    (
     SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'EXEC(N''sp_executesql N'''''' + ''SELECT ''''''''select '''''''' + pk + '''''''' as id, '''''''''''''''''''''''' + de + '''''''''''''''''''''''' as err '''''''' + CR + '''''''' UNION ALL'''''''' as sql FROM DVAS'''''' )')
    )
RETURN
GO

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

CREATE VIEW dbo.v_getErrors 
AS 
SELECT * FROM dbo.tvf_getErrors()

При этом я понял, что вы можете пропустить использование табличной функции и вызвать OpenRowSet непосредственно из представления, как это:

CREATE VIEW dbo.v_getErrors 
AS 
     SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'EXEC(N''sp_executesql N'''''' + ''SELECT ''''''''select '''''''' + pk + '''''''' as id, '''''''''''''''''''''''' + de + '''''''''''''''''''''''' as err '''''''' + CR + '''''''' UNION ALL'''''''' as sql FROM DVAS'''''' )')

Вот оно.Как только вы выясните все апострофы, это сработает.

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