Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
Sql server 如何使用带有IN关键字的表值参数_Sql Server_Stored Procedures_Table Valued Parameters - Fatal编程技术网

Sql server 如何使用带有IN关键字的表值参数

Sql server 如何使用带有IN关键字的表值参数,sql-server,stored-procedures,table-valued-parameters,Sql Server,Stored Procedures,Table Valued Parameters,编辑: 我试图替换: @LocationIDs NVARCHAR(MAX) = null, 与 但现在我得到一个错误,说: 必须声明标量变量@LocationId -结束编辑- 我有一个需要处理的存储过程: CREATE PROCEDURE [dbo].[spAP_GetTechnician_Door_Unlock] @LocationIDs NVARCHAR(MAX) = NULL, @AlarmDateFrom DATETIME = NULL, @Al

编辑:

我试图替换:

@LocationIDs NVARCHAR(MAX) = null,

但现在我得到一个错误,说:

必须声明标量变量@LocationId

-结束编辑-

我有一个需要处理的存储过程:

CREATE PROCEDURE [dbo].[spAP_GetTechnician_Door_Unlock]   
    @LocationIDs NVARCHAR(MAX) = NULL,  
    @AlarmDateFrom DATETIME = NULL,  
    @AlarmDateTo DATETIME = NULL,  
    @TechnicianID INT = NULL,
    @LocationId INT = NULL
AS
BEGIN
    IF (@LocationIDs = 'x')  
    BEGIN
        SELECT @LocationIDs = dbo.fn_GetAll_Location_Id()  
    END

    DECLARE @query NVARCHAR(MAX);

    SET @query = 'WITH CTE AS (SELECT ROW_NUMBER() OVER(ORDER BY al.Alarm_Log_ID desc)AS RowNumber,  
 isnull(t.Technician_ID,'''')[Technician_ID], (isnull(t.Last_Name,'''') +'' ''+  isnull(t.Name,''''))  TechnicianName,isnull(t.Emailid,'''') as EmailID,isnull(t.phone,'''') as Phone,dbo.fNAP_DateFormat(al.Alarm_date) as Alarm_date,                  
 Al.Site_ID,s.Name as SiteName,al.point_Address,l.location_Name,l.Location_ID ,shs.StatusData                  
from z_EntityMast_Alarm_Log al                   
left join  z_EntityMast_Technician t on al.Technician_ID=t.Technician_id                  
left join z_EntityMast_Site s on s.Site_ID=al.Site_ID                  
left join z_EntityMast_Location l on s.Location_ID=l.Location_id                  
left join z_EntityMast_Site_Hardware_Status shs on s.site_id=shs.siteid                   
left join z_SysVar_Alarm_Type_00004 at on al.Alarm_Type=at.ID                   
where at.Is_Linkable=1 and al.Alarm_Type !=70'               
if(isnull(@LocationId,0)!=0)            
set @query=@query+' and s.Location_ID ='+convert(varchar(12),@LocationId);            
else            
set @query=@query+' and s.Location_ID in ('+@LocationIDs+')';   
if(isnull(@AlarmDateFrom,0)!=0 and @AlarmDateFrom !='')  
set @query=@query+'and (DATEDIFF(DAY,'''+convert(varchar(30),@AlarmDateFrom)+''', al.Alarm_Date)>=0 and  DATEDIFF(DAY,'''+convert(varchar(30),@AlarmDateTo)+''',al.Alarm_Date)<=0)';                
if(isnull(@TechnicianID,0)!=0)  
set @query=@query+'and t.Technician_ID ='+ convert(varchar(10),@TechnicianID);  
set @query=@query + ')';  
set @query=@query +'select * from CTE ';  

    -- PRINT @query  
    EXEC (@query)  
END
我的问题是:如何替换这行代码并用表值参数替换它,从而使串联仍然有效

谢谢

在'+@LocationIDs+'中设置@query=@query+'和s.Location_ID; 我的问题是:如何替换这行代码 使用表值参数,使串联 还能用吗

假设您的LocationIdArray具有以下定义:

create type LocationIdArray as table (LocationId int);
那么您的IN应该如下所示:

and s.Location_ID in (select LocationId from @LocationIDs)

这在exec中不起作用,因为@LocationID在exec的外部作用域中,您可以在sp_executesql中将其作为参数传递,但最好将动态查询重写为静态查询,因为这里没有理由使用动态代码。

从您认为有问题的行打印@query时,结果如何请参见编辑。我现在得到一个错误,必须声明标量变量@LocationIDs.oh我明白了。。查找带有参数的动态sql我反复阅读了该站点,但我不知道这在这种情况下会有什么帮助..当我粘贴SP并运行它并检查sql时,我注意到最后一个SELECT*FROM CTE前面没有空格。请再次检查您的输出。然后复制/粘贴并运行它。问题主要与将动态SQL组合在一起的方式中的错误有关。
create type LocationIdArray as table (LocationId int);
and s.Location_ID in (select LocationId from @LocationIDs)