配置中的动态查询 table - 必须声明标量变量
Dynamic query in configuration table - must declare the scalar variable
我有以下代码:
/* 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
上面整个查询的目的是让一个配置 table 包含插入日志记录的查询。我想从配置 table 中获取此查询并将其设置为存储过程中的变量 @logInsert。然后我想在存储过程中做一些数据清理并执行存储在变量(@logInsert)中的查询。但它不会以这种方式工作,因为会抛出错误:
"Must declare the scalar variable .."
我应该如何修改代码才能从配置 table 中 运行 动态查询?我需要在配置 table 中有这个查询,因为我将在其他几个存储过程中调用它,因此我不想在每个存储过程中对它进行硬编码,因为查询可能会改变,我想在一个中改变它放在后面。
您需要将变量传递给动态 sql:
EXEC dbo.sp_executesql
@logInsert,
N'@StartTime DATETIME,
@EndTime DATETIME,
@JobName VARCHAR(200),
@StepName VARCHAR(100),
@RowCount INT',
@StartTime ,
@EndTime ,
@JobName ,
@StepName ,
@RowCount ;
解释:
当您使用 Dynamic-SQL 时,会创建新的上下文。您的变量在另一个范围内,无法访问。你需要通过它们,这样你才能使用它们。
我有以下代码:
/* 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
上面整个查询的目的是让一个配置 table 包含插入日志记录的查询。我想从配置 table 中获取此查询并将其设置为存储过程中的变量 @logInsert。然后我想在存储过程中做一些数据清理并执行存储在变量(@logInsert)中的查询。但它不会以这种方式工作,因为会抛出错误:
"Must declare the scalar variable .."
我应该如何修改代码才能从配置 table 中 运行 动态查询?我需要在配置 table 中有这个查询,因为我将在其他几个存储过程中调用它,因此我不想在每个存储过程中对它进行硬编码,因为查询可能会改变,我想在一个中改变它放在后面。
您需要将变量传递给动态 sql:
EXEC dbo.sp_executesql
@logInsert,
N'@StartTime DATETIME,
@EndTime DATETIME,
@JobName VARCHAR(200),
@StepName VARCHAR(100),
@RowCount INT',
@StartTime ,
@EndTime ,
@JobName ,
@StepName ,
@RowCount ;
解释:
当您使用 Dynamic-SQL 时,会创建新的上下文。您的变量在另一个范围内,无法访问。你需要通过它们,这样你才能使用它们。