如何将参数传递给参数化查询?

时间:2018-12-31 21:07:09

标签: sql sql-server

我需要从包含参数的数据库表中获取查询。然后使用该查询来更新另一个表,但是我需要能够将另一个参数传递给该更新语句。

declare @locnum int
set @locnum = 032

declare @tempPersonID int
set @tempPersonID = 10008

declare @passwordQuery varchar(max)
set @passwordQuery = (select passwordQuery from location where locationNum = @locnum)

select @passwordQuery

update tempPerson 
set [password] = @passwordQuery
where tempPersonID = @tempPersonID

select *
from tempPerson

select @passwordQuery返回(select left(firstname,1) + left(lastname,1) + custom as [password] from tempPerson where tempPersonID = @tempPersonID)。我需要能够在此查询和where语句中使用@tempPersomID参数。

2 个答案:

答案 0 :(得分:1)

首先,当您更新记录时,您从中选择信息时,您仅需要以下内容作为您的@passwordQuery

left(firstname,1) + left(lastname,1)  + [custom]

然后下面的代码将您的代码用于动态SQL:

declare @locnum int = 032, @tempPersonID int = 10008, @passwordQuery varchar(max), @sql nvarchar(max), @params nvarchar(max);

select @passwordQuery = passwordQuery from [location] where locationNum = @locnum;

-- select @passwordQuery

set @sql = 'update tempPerson set [password] = ' + @passwordQuery
  + ' where tempPersonID = @tempPersonID';
set @params = '@tempPersonID int';

execute sp_executesql @sql, @params, @tempPersonID = @tempPersonID; 

select *
from tempPerson

答案 1 :(得分:0)

您可以使用EXECsp_ExecuteSQL语句通过参数执行动态SQL语句。

就您而言,sp_ExecuteSQL似乎更合适。语法如下所示

sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]  

因此,您的整个脚本可以如下重写:

DECLARE @locnum INT
        @tempPersonID INT,
        @passwordQuery VARCHAR(MAX),
        @params VARCHAR(500),
        @ParamOut VARCHAR(500)

SELECT  
    @locnum = 032,
    @tempPersonID = 10008,
    @params = N'@tempPersonID INT,@MyPwd VARCHAR(500) OUTPUT'

SELECT
    @passwordQuery = 'SET @MyPwd = ('+passwordQuery+')'
    FROM Location 
        WHERE LocationNum = @locnum


sp_ExecuteSQL(@passwordQuery,@params,@tempPersonID,@MyPwd = @ParamOut OUTPUT )

UPDATE tempPerson 
    SET 
        [password] = @ParamOut
    WHERE tempPersonID = @tempPersonID

select *
from tempPerson