Я создаю хранимую процедуру, которая извлекает данные для заполнения радиолокационной карты. Он работал довольно хорошо, используя статические таблицы и строки, как это:
(это всего лишь кусок кода)
SELECT
@aAvg = CAST(AVG(1. * foerderpy_1617) as DECIMAL(18,4)),
@aMin = CAST(MIN(1. * foerderpy_1617) as DECIMAL(18,4)),
@aMax = CAST(MAX(1. * foerderpy_1617) as DECIMAL(18,4))
FROM foerderpy a WHERE SUBSTRING(a.BSN,3,1) = 'g';
Но теперь я хочу динамический sql. Я хочу, чтобы хранимая процедура всегда занимала последнюю строку в моей таблице:
(это просто кусочки кода)
DECLARE @SQL AS NVARCHAR(MAX);
DECLARE @aAvg AS NVARCHAR(MAX);
DECLARE @aMin AS NVARCHAR(MAX);
DECLARE @aMax AS NVARCHAR(MAX);
DECLARE @tabname SYSNAME;
DECLARE @coluname SYSNAME;
DECLARE @counter INTEGER;
SET @tabname = 'foerderpy'
SET @counter = (
SELECT MAX(ORDINAL_POSITION)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tabname
GROUP BY TABLE_NAME)
SET @coluname = (
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @tabname AND
ORDINAL_POSITION = @counter)
SET @aAvg = (SELECT CAST(AVG(1. * @coluname) as DECIMAL(18,4))FROM @tabname a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING(@restriction,3,1))
В последней строке (SET @aAvg) хранимая процедура перестает работать, и sql говорит мне: «Я должен объявить @tabname», хотя я obv. объявил это выше. Какая проблема мне не хватает? Можно ли даже сделать то, что я пытаюсь?
Остальная часть Кодекса не вызывает никаких проблем, поэтому я оставил это. Мне нужно @aAvg, чтобы вычислить позже в этой процедуре.