T-SQL:为什么sp_executesql需要它的参数类型?

时间:2019-04-07 03:32:44

标签: sql sql-server tsql

我想知道sp_executesql为什么需要准确说明其所有参数类型(@params)。

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

由于用户每次传递参数时-每个参数已经具有自己的类型(我希望)可以在存储过程中确定而无需明确描述?

2 个答案:

答案 0 :(得分:3)

sp_executeSql是执行动态SQL语句的过程。 它没有执行语句中使用的任何参数的定义-因此,您必须像使用任何其他使用参数的SQL语句一样提供这些定义。
如果您不发送参数定义,则SQL Server引擎将无法知道如何处理动态SQL语句中的参数。

来自official documentation

  

注意
  @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