Sql server sql2005中的动态tsql

Sql server sql2005中的动态tsql,sql-server,sql-server-2005,tsql,Sql Server,Sql Server 2005,Tsql,您好,我正在使用以下动态sql: declare @cmd nvarchar(4000) set @cmd= 'select ''exec msdb.dbo.sp_update_job @job_id='''''' + convert(nvarchar(255), job_id)+ '''''', @owner_login_name=''''sa'''';'' from msdb..sysjobs' exec sp_executesql @cmd 但它所做的只是以exec的身份打印

您好,我正在使用以下动态sql:

declare @cmd nvarchar(4000)

set @cmd= 

'select ''exec msdb.dbo.sp_update_job @job_id=''''''
+ convert(nvarchar(255), job_id)+ '''''',

@owner_login_name=''''sa'''';''
from msdb..sysjobs'


exec sp_executesql @cmd
但它所做的只是以exec的身份打印

我想执行结果,而不仅仅是打印结果

我该怎么办

问候

手动删除“选择”按钮!(并删除一些转义单引号) 换句话说

set @cmd=
   'exec msdb.dbo.sp_update_job @job_id=''' 
   + convert(nvarchar(255), job_id)  
   + ''', @owner_login_name=''sa'';'
注意:不太确定最后一件事是否合适(可能在sp_update_job语句末尾)

   -- from msdb..sysjobs'   
本质上,SELECT语句执行的动态SQL是一个SELECT语句,它恰好选择了一个动态构建的字符串。SQL将打印该字符串,就像SELECT语句被打印一样,比如:

select 'Once upon a time, a very poor lumberjack..."
(选择后字符串中的任何内容都不会以任何方式影响SQL)

现在,更明显的是,Remus的问题格式很好,动态SQL语句本身似乎是错误的,但至少SQL会尝试执行它,现在…

删除“选择”!(同时删除一些转义单引号) 换句话说

set @cmd=
   'exec msdb.dbo.sp_update_job @job_id=''' 
   + convert(nvarchar(255), job_id)  
   + ''', @owner_login_name=''sa'';'
注意:不太确定最后一件事是否合适(可能在sp_update_job语句末尾)

   -- from msdb..sysjobs'   
本质上,SELECT语句执行的动态SQL是一个SELECT语句,它恰好选择了一个动态构建的字符串。SQL将打印该字符串,就像SELECT语句被打印一样,比如:

select 'Once upon a time, a very poor lumberjack..."
(选择后字符串中的任何内容都不会以任何方式影响SQL)

现在,更明显的是,Remus很好地格式化了这个问题,动态SQL语句本身似乎是错误的,但至少SQL会尝试执行它,现在…

怎么样:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = COALESCE(@sql, '') + '
    EXEC msdb.dbo.sp_update_job @job_id = ''' 
    + CONVERT(NVARCHAR(255), job_id) 
    + ''', @owner_login_name = ''sa'';'
FROM msdb.dbo.sysjobs;

EXEC sp_sqlexec @sql;
请注意,sp_sqlexec未记录且不受支持。要以受支持的方式执行此操作,为什么不创建一个游标,它更易于跟踪和调试(没有红色海洋,也没有“不可见”的SQL):

或者更简单,因为从技术上讲msdb.dbo.sysjobs不是一个系统表,您可以直接编辑它:

UPDATE msdb.dbo.sysjobs 
    SET owner_sid = SUSER_SID('sa');
那么:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = COALESCE(@sql, '') + '
    EXEC msdb.dbo.sp_update_job @job_id = ''' 
    + CONVERT(NVARCHAR(255), job_id) 
    + ''', @owner_login_name = ''sa'';'
FROM msdb.dbo.sysjobs;

EXEC sp_sqlexec @sql;
请注意,sp_sqlexec未记录且不受支持。要以受支持的方式执行此操作,为什么不创建一个游标,它更易于跟踪和调试(没有红色海洋,也没有“不可见”的SQL):

或者更简单,因为从技术上讲msdb.dbo.sysjobs不是一个系统表,您可以直接编辑它:

UPDATE msdb.dbo.sysjobs 
    SET owner_sid = SUSER_SID('sa');

但是我需要从msdb..sysjobs获取数据,所以我需要select语句。您如何编写我的代码?我不认为Manjot posted命令的全部用途是可以理解的。他不是试图执行单个动态SQL语句,而是试图为select结果中的每一行执行存储过程。如果您查看第一个code代码段,你能解释一下转换行中提到的作业id是从哪里来的吗?@Manjot我理解。我在评论为什么exec不能工作,但是看到你的需要,你可能根本不需要任何动态代码。(,马上回来…)@Manjot.我回来太晚了,显然Aaron为你提供了一种有效地完成项目所需的方法。好事情!假设你是一个“他”,集体道歉,我经常小心地使用“他/她”当有疑问时,但我有时也会忘记,这是一件容易做到的事情,因为你的性别在这方面的代表性似乎普遍不足。欢迎并带来更多的女朋友;-)对不起,Manjot,就像mjv一样,我的假设是错误的。但是我需要从msdb..sysjobs获取数据,所以我需要select语句。您如何编写我的代码?我不认为Manjot POST命令的全部用途是可以理解的。他并不是在尝试执行一条动态SQL语句,而是在尝试为数据库中的每一行执行存储过程选择的结果。如果您查看第一个代码段,您能解释转换行中提到的作业id来自何处吗?@Manjot我理解。我在评论为什么exec不工作,但看到您的需要,您可能根本不需要任何动态代码。(,稍后回来…)@Manjot.我回来太晚了,显然Aaron为你提供了一种有效地完成项目所需的方法。好事情!假设你是一个“他”,集体道歉,我经常小心地使用“他/她”当有疑问时,但我有时也会忘记,这是一件容易的事情,因为你的性别在SO中的代表性似乎普遍不足。欢迎并带来更多的女朋友;-)对不起,像mjv一样,我的假设不好。谢谢。最后一点帮助了我。顺便问一下,什么是合并?我以为光标总是坏的不,不是真的。在大多数情况下,基于集合的解决方案更好。但是在某些情况下,游标是首选的,例如像这样的维护任务,每行需要执行一个存储过程,甚至一些复杂的更新/滚动求和操作。谢谢。最后一点帮助了我。顺便问一下,什么是合并?我以为光标总是坏的不,不是真的。在大多数情况下,基于集合的解决方案更好。但在某些情况下,游标是首选的,例如像这样的维护任务、每行需要执行一个存储过程的情况,甚至是一些复杂的更新/滚动求和操作。