繁体   English   中英

错误必须在 sql server 中声明标量变量

[英]Error Must declare scalar variable in sql server

我目前正在使用 JSON 和 SQL,我正在尝试编写动态 sql 命令,但 sql server 总是说“必须声明标量变量“@AgencesP” ”,我不知道我做错了什么,因为如果我尝试SELECT * FROM @AgencesP我有我的数据。

DECLARE @AgencesP TABLE (Agence INT, Groupe INT)
DECLARE @P VARCHAR(MAX)
DECLARE @SQLC VARCHAR(MAX)

SET @P = N'{ "Agences":[ 1, 6 ],"Groupes":[ 40, 45 ] }' --Agences

INSERT INTO @AgencesP (Agence, Groupe)
SELECT *
    FROM OpenJSON(@P,'$.Agences') 
        WITH(Agence INT '$')
    LEFT JOIN OpenJSON(@P,'$.Groupes')
        WITH(Groupe INT '$') ON 1=1    

SET @SQLC = 'SELECT TOP 20 * '+
    'FROM GRH_T_Salarie '+
    'INNER JOIN @AgencesP ON GRH_T_Salarie.IdAgenceExploitation ='+@AgencesP.Agence

您可以简化语句:

DECLARE @P VARCHAR(MAX)
SET @P = N'{ "Agences":[ 1, 6 ],"Groupes":[ 40, 45 ] }' --Agences

SELECT TOP 20 *
FROM GRH_T_Salarie 
INNER JOIN (
   SELECT Agence, Groupe
   FROM OPENJSON(@P,'$.Agences') WITH (Agence INT '$')
   OUTER APPLY OPENJSON(@P,'$.Groupes') WITH (Groupe INT '$')
) agnt ON GRH_T_Salarie.IdAgenceExploitation = agnt.Agence

当然,如果你是...尝试写一个动态的sql命令... (虽然你不需要动态语句),传递一个表作为参数需要一个表类型声明:

CREATE TYPE AgencesPType AS TABLE (Agence INT, Groupe INT)
DECLARE @AgencesP AgencesPType
DECLARE @P VARCHAR(MAX)
DECLARE @SQLC NVARCHAR(MAX)

SET @P = N'{ "Agences":[ 1, 6 ],"Groupes":[ 40, 45 ] }' --Agences

INSERT INTO @AgencesP (Agence, Groupe)
SELECT *
    FROM OpenJSON(@P,'$.Agences') 
        WITH(Agence INT '$')
    LEFT JOIN OpenJSON(@P,'$.Groupes')
        WITH(Groupe INT '$') ON 1=1    

SET @SQLC = 
   N'SELECT TOP 20 * '+
   N'FROM GRH_T_Salarie g '+
   N'INNER JOIN @AgencesP a ON g.IdAgenceExploitation = a.Agence'

EXEC sp_executesql @SQLC, N'@AgencesP AgencesPType READONLY', @AgencesP    

尝试使用别名,例如:

  SET @SQLC = 'SELECT TOP 20 * '+
    'FROM GRH_T_Salarie '+
    'INNER JOIN @AgencesP agnt ON GRH_T_Salarie.IdAgenceExploitation =agnt.Agence'

编辑:我通过删除动态 SQL 命令使它工作:) 如果有人需要它的代码:

DECLARE @AgencesP TABLE (Agence INT, Groupe INT)
DECLARE @P VARCHAR(MAX)
DECLARE @SQLC VARCHAR(255)

SET @P = N'{ "Agences":[ 1, 6 ],"Groupes":[ 40, 45 ] }' --Agences

INSERT INTO @AgencesP (Agence, Groupe)
SELECT *
    FROM OpenJSON(@P,'$.Agences') 
        WITH(Agence INT '$')
    INNER JOIN OpenJSON(@P,'$.Groupes')
        WITH(Groupe INT '$') ON 1=1    

SELECT TOP 20 *
    FROM GRH_T_Salarie 
    INNER JOIN @AgencesP agnt ON GRH_T_Salarie.IdAgenceExploitation = agnt.Agence

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM