T-SQL Установка скалярной переменной со значением другой скалярной переменной - PullRequest
0 голосов
/ 27 апреля 2018

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

(это всего лишь кусок кода)

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, чтобы вычислить позже в этой процедуре.

1 Ответ

0 голосов
/ 27 апреля 2018

Вам нужно выполнить последний запрос, используя EXECUTE, потому что EXECUTE:

Выполняет командную строку или строку символов в пакете Transact-SQL

Таким образом, вы должны изменить последнюю строку вашей процедуры так, чтобы запрос записывался в строку и вызывался методом execute.

DECLARE @sql VARCHAR(max) = 'SELECT CAST(AVG(1. * ' + @coluname + ') as DECIMAL(18,4))FROM '+ @tabname +' a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING('+@restriction+',3,1)';
EXECUTE(@sql);

Если вы хотите сохранить значение в вашей переменной @aAvg, вы можете использовать sp_executesql с параметром out, таким образом:

DECLARE @sql VARCHAR(max) = 'SELECT CAST(AVG(1. * ' + @coluname + ') as DECIMAL(18,4))FROM '+ @tabname +' a WHERE SUBSTRING(a.BSN,3,1) = SUBSTRING('+@restriction+',3,1)';
exec sp_executesql @sql, N'@aAvg decimal(18,4) out', @aAvg out
select @aAvg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...