我想知道sp_executesql
为什么需要准确说明其所有参数类型(@params
)。
sp_executesql [ @stmt = ] statement
[
{ , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }
{ , [ @param1 = ] 'value1' [ ,...n ] }
]
由于用户每次传递参数时-每个参数已经具有自己的类型(我希望)可以在存储过程中确定而无需明确描述?
答案 0 :(得分:3)
sp_executeSql
是执行动态SQL语句的过程。
它没有执行语句中使用的任何参数的定义-因此,您必须像使用任何其他使用参数的SQL语句一样提供这些定义。
如果您不发送参数定义,则SQL Server引擎将无法知道如何处理动态SQL语句中的参数。
注意
@stmt可以包含与变量名称具有相同形式的参数,例如:
N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'
@stmt
中包含的每个参数在@params
参数定义列表和参数值列表中都必须有一个对应的条目。
答案 1 :(得分:1)
让我们看一个例子。
stage('Quality Gate') {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
catch(err) {
echo "Quality gate is failed"
rror = "${err}";
mail bcc: '',
cc: '',
charset: 'UTF-8',
from: '',
mimeType: 'text/html',
replyTo: '',
subject: "Quality Gate failed: ${env.JOB_NAME} ",
to: "user@example.com",
body: "<b>Pipeline failed due to quality fate failure, please investigate:${env.BUILD_URL} : http://sonarqube.example.com:9000/dashboard?id=com.test%3project</b>";
slackSend channel: '#notifications', message: "Pipeline failed due to quality gate is failure, please investigate:${env.BUILD_URL} : http://sonarqube.example.com:9000/dashboard?id=com.test%3project", teamDomain: 'test', tokenCredentialId: 'notifications-slack'
sh 'exit 1'
}}
(1)和(2)可以是create table #tbl (id int,val varchar(20))
insert #tbl values(1,'abc'),(2,'def')
create procedure update_tmp
@id int, @val varchar(50)
as
exec sp_executesql N'update #tbl set val=@val where id=@id', -- (1) query to execute
N'@id int, @val varchar(20)', -- (2) query params declaration
@id=@id, @val=@val -- (3) param initialization
-- left parts are defined in sp_executesql context, right parts go from outer sp definition
select * from #tbl