Sql server 配置表中的动态查询-必须声明标量变量

Sql server 配置表中的动态查询-必须声明标量变量,sql-server,tsql,variables,sql-server-2014,dynamicquery,Sql Server,Tsql,Variables,Sql Server 2014,Dynamicquery,我有以下代码: /* Log Table */ IF OBJECT_ID('tempdb..#LogETL') IS NOT NULL DROP TABLE #LogETL CREATE TABLE #LogETL ( LogETL INT IDENTITY(1,1) NOT NULL, StartTime DATETIME, EndTime DATETIME, JobName VARCHAR(100), StepName VARCHAR(100), RowsInserted INT, Row

我有以下代码:

/* Log Table */
IF OBJECT_ID('tempdb..#LogETL') IS NOT NULL
DROP TABLE #LogETL

CREATE TABLE #LogETL (
LogETL INT IDENTITY(1,1) NOT NULL,
StartTime DATETIME,
EndTime DATETIME,
JobName VARCHAR(100),
StepName VARCHAR(100),
RowsInserted INT,
RowsUpdated INT,
RowsDeleted INT
)

/* Config Table */

IF OBJECT_ID('tempdb..#LogConfigQuery') IS NOT NULL
DROP TABLE #LogConfigQuery

CREATE TABLE #LogConfigQuery (
QueryType NVARCHAR(200), 
Query NVARCHAR(1000)
)

INSERT INTO #LogConfigQuery
VALUES ('INSERT',
'INSERT INTO #LogETL
        ( StartTime ,
          EndTime ,
          JobName ,
          StepName ,
          RowsInserted ,
          RowsUpdated ,
          RowsDeleted
        )
VALUES  ( @StartTime ,
          @EndTime ,
          @JobName ,
          @StepName ,
          @RowCount ,
          0 ,
          0 
        )'
)

---------------------------------

/* Declare Log Variables */

DECLARE @StartTime DATETIME
DECLARE @EndTime DATETIME
DECLARE @JobName VARCHAR(200)
DECLARE @StepName VARCHAR(100)
DECLARE @RowCount INT

/* Declare Query */

-- insert
DECLARE @logInsert NVARCHAR(1000)
SET @logInsert = (SELECT Query FROM #LogConfigQuery WHERE QueryType = 'INSERT')
SELECT @logInsert

/* Clean Data */

SET @StartTime = (SELECT GETDATE())
SET @JobName = OBJECT_NAME(@@PROCID)
SET @StepName = 'Clean Data'

IF OBJECT_ID('tempdb..#hey') IS NOT NULL
DROP TABLE #hey
SELECT *
INTO #hey
FROM (
SELECT 'omg' omg
UNION ALL
SELECT 'omg' omg
) X

SET @RowCount = @@ROWCOUNT
SET @EndTime = (SELECT GETDATE())

/* Log Clean Data */

EXEC sp_executesql @logInsert
上面整个查询的目的是拥有一个配置表,其中包含用于插入日志记录的查询。我想从配置表中获取此查询,并在存储过程中将其设置为变量@logInsert。然后我想在存储过程中进行一些数据清理,并执行存储在变量@logInsert中的查询。但当抛出错误时,它不会以这种方式工作:

必须声明标量变量


我应该如何修改代码以便可以从配置表运行动态查询?我需要在配置表中包含此查询,因为我将在其他几个存储过程中调用它,因此我不想在每个存储过程中硬编码它,因为查询可能会更改,我希望在之后的某个位置更改它。

您需要将变量传递给动态sql:

说明:

使用动态SQL时,将创建新的上下文。您的变量在另一个作用域中,无法访问。你需要传递它们,这样你才能使用它们


更多信息请访问。

非常好,非常简单。如果您还可以发布一些关于在初学者级别传递变量的文章,那就太好了。谢谢。@DNac我建议官方文件有你需要知道的一切+示例代码
EXEC dbo.sp_executesql 
   @logInsert,
   N'@StartTime DATETIME,
     @EndTime DATETIME,
     @JobName VARCHAR(200),
     @StepName VARCHAR(100),
     @RowCount INT',
   @StartTime ,
   @EndTime ,
   @JobName ,
   @StepName ,
   @RowCount ;