Мое решение: я создал временную таблицу и записал свои результаты в нее, где число было больше 0. Затем я просто запрашиваю таблицу tmp.Примечание. Я удаляю таблицу tmp и заново создаю ее каждый раз, когда мы работаем в нестабильных средах, которые часто обновляются.
- Цель SQL - вернуть список имен таблиц, в которых есть значение«Синий» в поле PAINTCOLOUR.
SET NOCOUNT ON
go
DECLARE @tablename nvarchar(256)
DECLARE @sqlStatement nvarchar(300)
- Сначала получите все таблицы из БД, где существует поле с именем «PAINTCOLOUR», и сохраните их в tnames_cursor
DECLARE tnames_cursor CURSOR FOR SELECT A.name
FROM [dbPath] A
WHERE A.name in (SELECT B.RECNAME FROM TBLRECFIELD B WHERE B.FIELDNAME = 'PAINTCOLOUR' AND B.RECNAME = A.name)
ORDER BY A.name
-NEW: если MY_TMP_TBL существует, отбросить его
IF object_id('dbo.MY_TMP_TBL') is not null
DROP TABLE dbo.MY_TMP_TBL
- NEW: создать временную таблицу MY_TMP_TBL
CREATE TABLE MY_TMP_TBL
(
TABLENAME varchar(255),
COUNTOFRECORDS varchar(255)
)
- перебрать tnames_cursor, передавая каждое имя таблицы в оператор Select ниже
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
- ОБНОВЛЕНО: Выберите для каждого @tablename имя, чтобы увидеть, существует ли значение «СИНИЙ» в поле PAINTCOLOUR, и если да, то сколько раз.Записать результаты во временную таблицу --MY_TMP_TBL, где счетчик больше 0.
SET @sqlStatement = 'INSERT INTO MY_TMP_TBL (TABLENAME, COUNTOFRECORDS) SELECT '''+@tablename+''', COUNT(*) from PS_'+RTRIM(UPPER(@tablename))+' where PAINTCOLOUR = ''BLUE'' HAVING COUNT (*) > 0 '
EXEC (@sqlStatement)
FETCH NEXT FROM tnames_cursor INTO @tablename
END
go
DEALLOCATE tnames_cursor
go
- NEW: теперь вы можете запросить результаты MY_TMP_TBL.
SELECT * FROM MY_TMP_TBL;