Если ваш файл непротиворечив, это сохранит вашу информацию в словаре:
with open('envparam.config') as f:
data = {}
for line in f:
key, value = line.strip().split('=')
data[key] = value
Затем вы можете получить к нему доступ следующим образом:
>>> data['DBSID']
SID
Попробуйте это:
EXEC sp_executesql @sql, N'@id int', @id
Больше информации в этой большой статье: http://www.sommarskog.se/dynamic_sql.html
Что касается вывода, должен выглядеть примерно так Ваш ВЫБОР:
SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id
Я выбираю 'идентификатор' вместо '*', чтобы не вытягивать ненужные данные...
Затем Ваш динамический sql должен быть чем-то вроде этого:
EXEC sp_executesql @sql,
N'@id int, @countVal int OUTPUT',
@id,
@countVal OUTPUT
Этот пример адаптирован от той же статьи, связанной выше в разделе sp_executesql.
Что касается Вашей ошибки Oracle, необходимо будет узнать точный SQL, который sp_executesql отправляет Oracle. Если существует профилировщик или журнал запросов в Oracle, которая может помочь. Я ограничил опыт с Oracle, но это было бы следующим логическим шагом для поиска и устранения неисправностей Вашей проблемы.
Я не знаю, почему Вы - идентификатор передачи отдельно.
Вы могли сделать следующее
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id
Быстрый и грязный путь состоит в том, чтобы просто создать строку перед использованием оператора EXEC, однако это не методические рекомендации, поскольку можно открыть себя до Внедрения SQL.
DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle
Корректный способ сделать это должно использовать системную хранимую процедуру sp_executesql, как детализировано венецианской вельможей, и рекомендуемый Microsoft в Книгах Онлайн:
EXEC sp_executesql @sql, N'@id int', @id