Добавление переменных в 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
Вернуться на верх