Добавление переменных в SQL-запросы
У меня есть следующий код, который возвращает таблицу из моей базы данных ms sql
one_yrs_ago = datetime.now() - relativedelta(years=1)
all = 'SELECT Master_Sub_Account , cAccountTypeDescription , Debit , Credit FROM [Kyle].[dbo].[PostGL] AS genLedger'\
' Inner JOIN [Kyle].[dbo].[Accounts] '\
'on Accounts.AccountLink = genLedger.AccountLink '\
'Inner JOIN [Kyle].[dbo].[_etblGLAccountTypes] as AccountTypes '\
'on Accounts.iAccountType = AccountTypes.idGLAccountType'\
' WHERE genLedger.AccountLink not in (161,162,163,164,165,166,167,168,122)'\
Как бы я добавил переменную one_yrs_ago в SQL запрос в данной ситуации, например, так :
one_yrs_ago = datetime.now() - relativedelta(years=1)
all = 'SELECT Master_Sub_Account , cAccountTypeDescription , Debit , Credit FROM [Kyle].[dbo].[PostGL] AS genLedger'\
' Inner JOIN [Kyle].[dbo].[Accounts] '\
'on Accounts.AccountLink = genLedger.AccountLink '\
'Inner JOIN [Kyle].[dbo].[_etblGLAccountTypes] as AccountTypes '\
'on Accounts.iAccountType = AccountTypes.idGLAccountType'\
' WHERE genLedger.AccountLink not in (161,162,163,164,165,166,167,168,122)'\
' AND WHERE genLedger.TxDate > ' one_yrs_ago''
Не вижу полного контекста, но вот как я бы сделал это в SQL Server
Я бы сказал, что параметризация того, что вы передаете, очень важна, так как иначе вы можете получить SQL-инъекцию!
Полный пример для игры, обратите внимание, что вы объявляете параметры и их типы, а затем передаете фактические значения, которые вы хотите получить, все в одной строке
EXEC sp_executesql @sqlToExec, N'@TheName NVARCHAR(100)', @TheName = 'Andrew'
Небольшой пример для выполнения ниже:
BEGIN TRANSACTION
BEGIN TRY
CREATE TABLE #Users (
Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] NVARCHAR(50) NOT NULL
)
INSERT INTO #Users ([Name])
VALUES('Andrew'),
('Bob')
DECLARE @sqlToExec NVARCHAR(4000) = N'SELECT *
FROM #Users AS U
WHERE U.[Name] = @TheName'
EXEC sp_executesql @sqlToExec, N'@TheName NVARCHAR(100)', @TheName = 'Andrew'
ROLLBACK TRANSACTION
END TRY
BEGIN CATCH
PRINT 'Rolling back changes, there was an error!!'
ROLLBACK TRANSACTION
DECLARE @Msg NVARCHAR(MAX)
SELECT @Msg=ERROR_MESSAGE()
RAISERROR('Error Occured: %s', 20, 101,@msg) WITH LOG
END CATCH