#tsql
#tsql
Вопрос:
У меня есть только разрешения «на чтение» для базы данных. Я пытаюсь извлечь данные из нескольких таблиц с одинаковыми полями. Я извлекаю имена таблиц из information_schema и помещаю их в переменную. Как я могу получить все данные из каждого выбранного в один результирующий набор?
DECLARE @acct_code AS VARCHAR(40)
,@chk_tbl AS VARCHAR(40)
DECLARE CKTable_Cursor CURSOR FOR
SELECT table_name
FROM INFORMATION_SCHEMA.Tables
WHERE table_name LIKE 'CK%'
AND table_name > 'CK000000'
ORDER BY TABLE_NAME
OPEN CKTable_Cursor
FETCH NEXT FROM CKTable_Cursor
INTO @chk_tbl
SET @acct_code = SUBSTRING(@chk_tbl,3,LEN(@chk_tbl))
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC
('SELECT ck.inserteddatetime AS [Inserted Datetime]
,actcode AS [Account Code]
,actname AS [Account Name]
,chk_num AS [Check Number]
,payee AS [Payee]
,supplier AS [Supplier]
,balance AS [Balance]
FROM dbo.' @chk_tbl ' AS ck WITH (NOLOCK)
LEFT JOIN dbo.ChtActs AS coa WITH (NOLOCK)
ON CONVERT(VARCHAR(40),actcode) = ' @acct_code)
FETCH NEXT FROM CKTable_Cursor
INTO @chk_tbl
SET @acct_code = SUBSTRING(@chk_tbl,3,LEN(@chk_tbl))
END
CLOSE CKTable_Cursor;
DEALLOCATE CKTable_Cursor;
Комментарии:
1. Советы: Наилучшая практика при сборке имен объектов в динамические операторы SQL — использовать
QuoteName()
, чтобы избежать проблем с нечетными именами, напримерNew Table
, с пробелом или зарезервированными словами, такими какFrom
.@acct_code
должен быть передан в качестве параметра.2. Спасибо за советы! Я буду использовать их в будущем.
3. причина, по которой вы используете quotename, заключается в том, что ваше поле данных может содержать апостроф, который необходимо заменить на »