Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 动态SQL将局部变量读取为表变量?_Tsql_Variables_Dynamic_Local - Fatal编程技术网

Tsql 动态SQL将局部变量读取为表变量?

Tsql 动态SQL将局部变量读取为表变量?,tsql,variables,dynamic,local,Tsql,Variables,Dynamic,Local,这与使用表变量无关-这与使用局部变量在动态SQL游标中携带db地址有关,理论上,动态SQL游标的工作原理如下: --假设已声明全局变量@sql、AnalysisLocation和@sp_executeSql ALTER PROCEDURE [dbo].[sp_AggregateCompliance_Report] @clientID int, @InvScrDBLocation nvarchar(250), @JoinFilter nvarchar(max) = '', @Criteria nv

这与使用表变量无关-这与使用局部变量在动态SQL游标中携带db地址有关,理论上,动态SQL游标的工作原理如下: --假设已声明全局变量@sql、AnalysisLocation和@sp_executeSql

ALTER PROCEDURE [dbo].[sp_AggregateCompliance_Report]
@clientID int,
@InvScrDBLocation nvarchar(250),
@JoinFilter nvarchar(max) = '',
@Criteria nvarchar(max) = '',
@Year int = NULL

as

declare @sql nvarchar(4000)


set @sql = '
IF EXISTS (SELECT * FROM sys.tables WHERE name = ''tmp_Aggregate_Compliance_counts'')
TRUNCATE TABLE tmp_Aggregate_Compliance_counts
ELSE
CREATE TABLE tmp_Aggregate_Compliance_counts (
pfc_fk_prv_pkid int,
RxYear int,
RxMonth int,
Compliance decimal (6,5))
' print @sql  EXEC sp_executesql @sql


SET @Criteria = isnull(case when @Criteria like 'WHERE %' then 'AND '+substring(@criteria,7,len(@criteria)-6) else @Criteria end ,'')
SET @Year = isnull(@year, year(getdate())-1)


 set @sql = '
DECLARE @fk_cli_pkid INT
    ,   @ServerAndDB_for_pfcAppended nvarchar(100)

DECLARE client_set CURSOR FOR
SELECT  DISTINCT mtx.fk_cli_pkid, SettingValue+ ''.dbo.pfc_appended''
FROM    mtx_ComplianceAndEarlyRefill_tracking AS mtx
JOIN    prola7.Invoice_Screens.dbo.client_definition AS def
ON      mtx.fk_cli_pkID = def.fk_cli_pkid
AND     fk_lkSettings_pkID  = 45
AND     RecordStatus = 1 

OPEN    client_set

FETCH next FROM client_set
INTO    @fk_cli_pkid, @ServerAndDB_for_pfcAppended

WHILE   @@FETCH_STATUS = 0 BEGIN

INSERT INTO tmp_Aggregate_Compliance_counts (pfc_fk_prv_pkid, RxYear, RxMonth, Compliance)

SELECT  pfc.pfc_fk_prv_pkid
    ,   year(mtx.pfc_dateofservice) AS RxYear
    ,   0 AS RxMonth
    ,   cast(mtx.Compliance as decimal (6,5))
FROM    mtx_ComplianceAndEarlyRefill_tracking AS mtx
LEFT OUTER JOIN @ServerAndDB_for_pfcAppended AS pfc
ON      mtx.pp_clientfile   = pfc.pp_clientfile
AND     mtx.pp_mirror_pkid  = pfc.pp_mirror_pkid
AND     mtx.fk_cli_pkid     = @fk_cli_pkid
'+@JoinFilter+'
WHERE   pfc.pfc_status = 0
AND     year(mtx.pfc_dateofservice) = '+cast(@Year as nvarchar)+'
'+@Criteria+'
GROUP BY pfc.pfc_fk_prv_pkid, year(mtx.pfc_dateofservice)


FETCH next FROM client_set
INTO    @fk_cli_pkid, @ServerAndDB_for_pfcAppended

END

CLOSE client_set
DEALLOCATE client_set
' print @sql  EXEC sp_executesql @sql
这在编译动态代码时不会产生语法错误,但是在调用以下过程时:Msg 1087,级别15,状态2,第27行 必须声明表变量“@ServerAndDB_for_pfcappend”

当我使用这种类型的结构从过程外部将位置变量作为全局变量传入时,它会正确地接受它,但是作为局部变量,它似乎默认假定我打算将其作为表变量


我不想创建表变量。这是一个不可能的结构吗?

错误是由于您试图使用参数化的表名造成的。这是不可能的,只要表名应该是参数,就会使用动态查询,基本上如下所示:

SET @sql = 'SELECT … FROM ' + @tablename + ' WHERE …'
我认为,在您的情况下,游标应该从动态查询中取出,除了使用参数化表名的部分。类似这样的事情可能会:

ALTER PROCEDURE [dbo].[sp_AggregateCompliance_Report]
@clientID int,
@InvScrDBLocation nvarchar(250),
@JoinFilter nvarchar(max) = '',
@Criteria nvarchar(max) = '',
@Year int = NULL

as

declare @sql nvarchar(4000)


set @sql = '
IF EXISTS (SELECT * FROM sys.tables WHERE name = ''tmp_Aggregate_Compliance_counts'')
TRUNCATE TABLE tmp_Aggregate_Compliance_counts
ELSE
CREATE TABLE tmp_Aggregate_Compliance_counts (
pfc_fk_prv_pkid int,
RxYear int,
RxMonth int,
Compliance decimal (6,5))
' print @sql  EXEC sp_executesql @sql


SET @Criteria = isnull(case when @Criteria like 'WHERE %' then 'AND '+substring(@criteria,7,len(@criteria)-6) else @Criteria end ,'')
SET @Year = isnull(@year, year(getdate())-1)


DECLARE @fk_cli_pkid INT
    ,   @ServerAndDB_for_pfcAppended nvarchar(100)

DECLARE client_set CURSOR FOR
SELECT  DISTINCT mtx.fk_cli_pkid, SettingValue+ ''.dbo.pfc_appended''
FROM    mtx_ComplianceAndEarlyRefill_tracking AS mtx
JOIN    prola7.Invoice_Screens.dbo.client_definition AS def
ON      mtx.fk_cli_pkID = def.fk_cli_pkid
AND     fk_lkSettings_pkID  = 45
AND     RecordStatus = 1 

OPEN    client_set

FETCH next FROM client_set
INTO    @fk_cli_pkid, @ServerAndDB_for_pfcAppended

WHILE   @@FETCH_STATUS = 0 BEGIN

 set @sql = '
INSERT INTO tmp_Aggregate_Compliance_counts (pfc_fk_prv_pkid, RxYear, RxMonth, Compliance)

SELECT  pfc.pfc_fk_prv_pkid
    ,   year(mtx.pfc_dateofservice) AS RxYear
    ,   0 AS RxMonth
    ,   cast(mtx.Compliance as decimal (6,5))
FROM    mtx_ComplianceAndEarlyRefill_tracking AS mtx
LEFT OUTER JOIN @ServerAndDB_for_pfcAppended AS pfc
ON      mtx.pp_clientfile   = pfc.pp_clientfile
AND     mtx.pp_mirror_pkid  = pfc.pp_mirror_pkid
AND     mtx.fk_cli_pkid     = @fk_cli_pkid
'+@JoinFilter+'
WHERE   pfc.pfc_status = 0
AND     year(mtx.pfc_dateofservice) = '+cast(@Year as nvarchar)+'
'+@Criteria+'
GROUP BY pfc.pfc_fk_prv_pkid, year(mtx.pfc_dateofservice)
' print @sql  EXEC sp_executesql @sql


FETCH next FROM client_set
INTO    @fk_cli_pkid, @ServerAndDB_for_pfcAppended

END

CLOSE client_set
DEALLOCATE client_set

您收到的确切错误消息是什么?如果您提供可运行的代码来演示问题,也会很有帮助。实际的脚本和生成的错误在上面的每个编辑中都是可用的…这证实了我的怀疑。谢谢你的回复。