Exec和sp_executesql的用法区别
Exec和sp_executesql的用法区别Exec和sp_executesqlExec和sp_executesql的用法区别1,EXEC的使用2,sp_executesql的使用MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC 和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。
还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在后面的例子中会详加说明),还可以编写更安全的代码。
EXEC在某些情况下会更灵活。
除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql.1,EXEC的使用EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。
以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1DECLARE @TableName VARCHAR(50),@SqlNVARCHAR(MAX),@OrderID INT;SET @TableName = 'Orders';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName)+'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'EXEC(@sql);注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC:EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');SQL编译器就会报错,编译不通过,而如果我们这样:EXEC(@sql+@sql2+@sql3);编译器就会通过;所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了;EXEC不提供接口这里的接口是指,它不能执行一个包含一个带变量符的批处理,这里乍一听好像不明白,不要紧,我在下面有一个实例,您一看就知道什么意思.DECLARE @TableName VARCHAR(50),@SqlNVARCHAR(MAX),@OrderID INT;SET @TableName = 'Orders';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName)+'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'EXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就会产生一下错误Msg 137, Level 15, State 2, Line 1必须声明标量变量 "@OrderID"。
使用EXEC时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中,如:SET @sql = 'SELECT * FROM'+QUOTENAME(@TableName) +'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'串联变量的内容也存在性能方面的弊端。
SQL Server为每一个的查询字符串创建新的执行计划,即使查询模式相同也是这样。
为演示这一点,先清空缓存中的执行计划DBCC FREEPROCCACHE (这个不是本文所涉及的内容,您可以查看MS 的MSDN)/zh-cn/library/ms174283.aspx将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。
然后使用下面的代码查询SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE '%cach%' AND sql NOT LIKE '%sys.%'点击F5运行,就会出现下面如图所示的查询结果:我们可以看到,每执行一次都要产生一次的编译,执行计划没有得到充分重用。
EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。
默认情况下,EXEC把查询的输出返回给调用者。
例如下面代码返回Orders表中所有的记录数DECLARE @sql NVARCHAR(MAX)SET @sql = 'SELECT COUNT(ORDERID) FROM Orders';EXEC(@sql);然而,如果你要把输出返回给调用批处理中的变量,事情就没有那么简单了。
为此,你必须使用INSERT EXEC语法把输出插入到一个目标表中,然后从这表中获取值后赋给该变量,就像这样:DECLARE @sql NVARCHAR(MAX),@RecordCount INTSET @sql = 'SELECT COUNT(ORDERID) FROM Orders';CREATE TABLE #T(TID INT);INSERT INTO #T EXEC(@sql);SET @RecordCount = (SELECT TID FROM #T)SELECT @RecordCountDROP TABLE #T2,sp_executesql的使用sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。
为了和EXEC作一个鲜明的对比,我们看看如果用代码1的代码,把EXEC 换成sp_executesql,看看是否得到我们所期望的结果DECLARE @TableName VARCHAR(50),@sqlNVARCHAR(MAX),@OrderID INT ,@sql2 NVARCHAR(MAX);SET @TableName = 'Orders ';SET @OrderID = 10251;SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + 'WHERE OrderID = '+CAST(@OrderID AS VARCHAR(50)) + ' ORDER BY ORDERID DESC'EXEC sp_executesql @sql注意最后一行;事实证明可以运行;sp_executesql提供接口sp_executesql命令比EXEC命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。
这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。
它的构成包括:代码快,参数声明部分,参数赋值部分。
说了这么多,还是看看它的语法吧EXEC sp_executesql@stmt = <statement>,--类似存储过程主体@params = <params>, --类似存储过程参数部分<params assignment> --类似存储过程调用@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用sp_executesql;@params参数与定义输入/输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;@<params assignment> 与调用存储过程的EXEC部分类似。
为了说明sp_executesql对执行计划的管理优于EXEC,我将使用前面讨论EXEC时用到的代码。
1: DECLARE @TableName VARCHAR(50),@sqlNVARCHAR(MAX),@OrderID INT;2: SET @TableName = 'Orders ';3: SET @OrderID = 10251;4: SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = @OID ORDER BY ORDERID DESC'5: EXEC sp_executesql6: @stmt = @sql,7: @params = N'@OID AS INT ',8: @OID = @OrderID在调用该代码和检查它生成的执行计划前,先清空缓存中的执行计划;DBCC FREEPROCCACHE将上面的动态代码执行3次,每次执行都赋予@OrderID 不同的值,然后查询sys.syscacheobjects表,并注意它的输出,优化器只创建了一个备用计划,而且该计划被重用的3次SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE '%cache%' AND sql NOT LIKE '%sys.%' AND sql NOT LIKE '%sp_executesql%'点击F5运行,就会出现如下表所示的结果;sq_executesql的另一个与其接口有关的强大功能是,你可以使用输出参数为调用批处理中的变量返回值。
利用该功能可以避免用临时表返回数据,从而得到更高效的代码和更少的重新编译。
定义和使用输出参数的语法与存储过程类似。
也就是说,你需要在声明参数时指定OUTPUT子句。
例如,下面的静态代码简单的演示了如何从动态批处理中利用输出参数@p把值返回到外部批处理中的变量@i.DECLARE @sql AS NVARCHAR(12),@i AS INT;SET @sql = N' SET @p = 10';EXEC sp_executesql@stmt = @sql,@params = N'@p AS INT OUTPUT',@p = @i OUTPUTSELECT @i该代码返回输出10。
sql中 exec意思
sql中 exec意思SQL中的EXEC是执行一段动态SQL语句的命令。
具体来说,EXEC命令可以用于执行存储过程、执行动态SQL语句和执行系统存储过程。
1. 执行存储过程:在SQL Server中,存储过程是一种预编译的数据库对象,可以包含一系列的SQL语句和逻辑。
通过使用EXEC命令可以调用并执行存储过程。
例如,EXEC sp_name;可以执行名为sp_name的存储过程。
2. 执行动态SQL语句:动态SQL语句是指在程序运行时根据不同的条件动态生成的SQL 语句。
通过使用EXEC命令可以执行动态SQL语句。
例如,EXEC 'SELECT * FROM table_name';可以执行一条动态生成的查询语句。
3. 执行系统存储过程:系统存储过程是数据库管理系统自带的一些预定义的存储过程。
通过使用EXEC命令可以执行系统存储过程。
例如,EXEC sp_help;可以执行名为sp_help的系统存储过程,该存储过程用于显示指定对象的帮助信息。
在使用EXEC命令时,可以通过传递参数来实现更灵活的执行。
EXEC命令可以接受多个参数,并将这些参数传递给存储过程或动态SQL语句。
例如,EXEC sp_name @param1, @param2;可以执行存储过程sp_name,并将参数param1和param2传递给该存储过程。
EXEC命令的使用可以使SQL语句具有更高的灵活性和动态性。
它可以根据不同的条件执行不同的SQL语句,从而实现更加复杂和灵活的数据操作。
然而,使用EXEC命令时也需要注意一些安全性问题。
由于动态SQL语句的执行可能存在SQL注入等安全隐患,因此在使用EXEC命令执行动态SQL语句时应该谨慎处理用户输入,避免潜在的安全风险。
总结起来,SQL中的EXEC命令是执行一段动态SQL语句的命令,可以用于执行存储过程、执行动态SQL语句和执行系统存储过程。
它提供了一种灵活和动态的数据操作方式,但在使用时需要注意安全性问题。
sqlserver exec命令用法 -回复
sqlserver exec命令用法-回复SQL Server中的EXEC命令用于执行存储过程、用户定义的函数、动态SQL语句和系统存储过程等。
在本篇文章中,我们将逐步回答关于EXEC 命令的用法。
让我们开始吧!第一步:执行存储过程存储过程是一个预定义的SQL代码块,可以通过EXEC命令来执行。
EXEC 命令的语法如下:EXEC procedure_name;其中,procedure_name是要执行的存储过程的名称。
执行存储过程时,可以传递参数。
例如,我们有一个名为"GetEmployeeDetails"的存储过程,它接受一个参数@employee_id,返回给定员工ID的详细信息。
我们可以使用以下EXEC命令来执行该存储过程:EXEC GetEmployeeDetails @employee_id = 1001;此命令将执行名为"GetEmployeeDetails"的存储过程,并将值1001传递给@employee_id参数。
第二步:执行用户定义的函数除了存储过程,EXEC命令还可以用于执行用户定义的函数。
用户定义的函数是一个独立的代码块,接受输入参数并返回一个值。
EXEC命令的语法如下:EXEC @return_value = function_name parameter1, parameter2, ...;其中,function_name是要执行的函数的名称,参数是函数的输入参数,@return_value是函数的返回值。
假设我们有一个名为"CalculateAverageGrade"的函数,它接受两个参数@subject和@grade,并返回指定科目的平均成绩。
我们可以使用以下EXEC命令来执行该函数:EXEC @avg_grade = CalculateAverageGrade @subject = 'Math',@grade = 80;此命令将执行名为"CalculateAverageGrade"的函数,将参数'Math'传递给@subject参数,将值80传递给@grade参数,并将返回的平均成绩存储在@avg_grade变量中。
execsp_executesql比直接执行SQL慢,而且消耗大量资源问题
execsp_executesql⽐直接执⾏SQL慢,⽽且消耗⼤量资源问题今天SqlServer数据库出现了访问不通的情况,抓紧重启了下服务,让⼤家先恢复使⽤,然后我开了 SQL Server Profiler 看看是不是存在性能问题SQL,然后就发现⼀批这样的SQL,看reads到了6万、2万的级别,这个SQL查询的结果也就⼏条,这reads明显存在问题把SQL改写下试试,可以看到,SQL很快的,reads在个位数,确认存在问题⽆疑。
上⾯⾃动⽣成的SQL与改写的SQL对⽐,可以看到写法最⼤的区别就是 exec sp_executesql ,初步怀疑是这个引起的问题。
找到代码所在⾏,上⾯的SQL是使⽤的SqlSugar⽣成的代码List<Log_hh_god> wpList = _ILog_hh_godRep.FindListByClause(x => x.hhpc == hhpc);怀疑是不是⾃动⽣成的SQL有问题,改成⼿写的SQL,执⾏后发现还是不⾏List<Log_hh_crd> kxList = _ILog_hh_crdRep.QueryList<Log_hh_crd>("SELECT * FROM [Log_hh_crd] WHERE hhpc=@hhpc ", new { hhpc = hhpc });然后就是在⽹上找资料,最终有个回答引起了我的注意,于是我去确认了下Log_hh_crd表中的字段hhpc的类型,是varchar ,⽽上⾯⾃动⽣成的SQL⾥⾯是nvarcahr(4000),会不会是这个区别的问题呢改了⼀对⽐,结果很明显了,就是SQL中的类型与实际类型不⼀致,导致资源消耗远远超过预期。
试了SqlSugar提供的字段标注功能,有个ColumnDataType,加上试试[SqlSugar.SugarColumn(ColumnDataType = "varchar(40)")]public string hhpc { get; set; }结果不⾏,去翻了下⽂档,说“⾃定义⽣成的数据类型,⽣成表会⽤到”,这条路⾛不通了。
SQL Server 第二章 第二节 系统过程
EXEC sp_helpdb--:查看所有数据库名称及大小EXEC sp_helpindex'table_name'--:查看表索引EXEC sp_helpconstraint'table_name'--:查看表约束EXEC sp_helplogins--:查看所有数据库用户登录信息EXEC sp_helpsrvrolemember--:查看所有数据库用户所属的角色信息EXEC sp_helprotect--:查看某数据库下,对象级用户权限EXEC sp_helplinkedsrvlogin--:查看链接服务器EXEC sp_helpremotelogin--:查看远端数据库用户登录信息EXEC sp_helpfile --:返回与当前数据库关联的文件的物理名称及特性EXEC sp_stored_procedures--:查看数据库里所有的存储过程和函数EXEC sp_readerrorlog0, 1,'listening'--:查看SQL端口号EXEC sp_spaceused--:查看当前数据库大小--不一定准确:某个表的行数,保留大小,数据大小,索引大小,未使用大小exec sp_spaceused@objname='table_name'--:对象,包括:表、索引、索引视图等--准确:但有性能影响exec sp_spaceused@objname='db_test',@updateusage='true'EXEC sp_configure--:查看数据库启动的参数EXEC sp_renamedb'old_dbname','new_dbname'--:重命名数据库用的SQL EXEC sp_changeobjectowner[@objectname =]'object',[@newowner =] 'owner'--:更改某个数据对象的用户属主注意:更改对象名的任一部分都可能破坏脚本和存储过程。
SQLServersp_executesql介绍和使用
SQLServersp_executesql介绍和使⽤execute相信⼤家都⽤的⽤熟了,简写为exec,除了⽤来执⾏存储过程,⼀般都⽤来执⾏动态Sqlsp_executesql,sql2005中引⼊的新的系统存储过程,也是⽤来处理动态sql的, 如:exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out ,@id@sql为拼成的动态sqlN'@count int out,@id varchar(20)'为拼成的动态sql内的参数列表@cou out,@id为为动态sql内参数列表提供值的外部参数列表那么它们之间有什么区别呢?1、它们之间最⼤的区别是嵌⼊式的参数,如下⾯⼀个语句DECLARE @sql NVARCHAR(2000);DECLARE @id VARCHAR(20);SET @id = '1';SET @sql = 'select count(*) from emp where id=' + @id;EXEC @sql;我想把得到的count(*)传出来,⽤传统的exec是不好办到的,但是⽤sp_executesql则很容易就办到了:DECLARE @sql NVARCHAR(2000);DECLARE @cou INT;DECLARE @id VARCHAR(20);SET @id = '1';SET @sql = 'select @count=count(*) from emp where id=@id';EXEC sp_executesql @sql, N'@count int out,@id varchar(20)', @cou OUT, @id;PRINT @cou;2、性能可以看到,如果⽤exec,由于每次传⼊的@id不⼀样,所以每次⽣成的@sql就不⼀样,这样每执⾏⼀次Sql2005就必须重新将要执⾏的动态Sql重新编译⼀次但是sp_executesql则不⼀样,由于将数值参数化,要执⾏的动态Sql永远不会变化,只是传⼊的参数的值在变化,那每次执⾏的时候就秒⽤重新编译,速度⾃然快多了哈!注意:1.sp_executesql要求动态Sql和动态Sql参数列表必须是Nvarchar,⽐如上个例⼦的@sql,N'@count int out,@id varchar(20)'我记得在sql2005中Varchar也可以的,但是我打了Sp3补丁后就不⾏了,必须为Nvarchar2.动态Sql的参数列表与外部提供值的参数列表顺序必需⼀致,如:N'@count int out,@id varchar(20)', @cou out,@id@count 对应 @cou,@id对应@id如果不⼀致,必须显式标明,如:N'@count int out,@id varchar(20)', @id=@id, @count=@cou out3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名。
sql server 字符串 转公式 算结果
在SQL Server 中,可以使用`EXEC` 或`sp_executesql` 存储过程将字符串转换为公式并计算结果。
以下是一个示例:1. 首先,创建一个包含字符串的表:```sqlCREATE TABLE dbo.StringTable (ID INT PRIMARY KEY,Formula NVARCHAR(MAX));```2. 然后,向表中插入一些数据:```sqlINSERT INTO dbo.StringTable (ID, Formula)VALUES (1, '3 + 5'), (2, '7 * 9');```3. 使用`EXEC` 或`sp_executesql` 存储过程将字符串转换为公式并计算结果:```sql-- 使用EXECDECLARE @Result1 FLOAT;DECLARE @Result2 FLOAT;EXEC sp_executesql N'SELECT @Result1 = CASE WHEN Formula = ''3 + 5'' THEN 3 + 5 ELSE NULL END', N'@Result1 FLOAT OUTPUT', @Result1 OUTPUT;EXEC sp_executesql N'SELECT @Result2 = CASE WHEN Formula = ''7 * 9'' THEN 7 * 9 ELSE NULL END', N'@Result2 FLOAT OUTPUT', @Result2 OUTPUT;PRINT @Result1; -- 输出:8PRINT @Result2; -- 输出:63-- 使用sp_executesqlDECLARE @Result1 FLOAT;DECLARE @Result2 FLOAT;EXEC sp_executesql N'SELECT @Result1 = CASE WHEN Formula = ''3 + 5'' THEN 3 + 5 ELSE NULL END', N'@Result1 FLOAT OUTPUT', @Result1 OUTPUT;EXEC sp_executesql N'SELECT @Result2 = CASE WHEN Formula = ''7 * 9'' THEN 7 * 9 ELSE NULL END', N'@Result2 FLOAT OUTPUT', @Result2 OUTPUT;PRINT @Result1; -- 输出:8PRINT @Result2; -- 输出:63```在这个示例中,我们首先创建了一个包含字符串的表,然后向表中插入了一些数据。
sqlserver动态sql执行execute和sp_executesql,用动态SQL语。。。
1> @sql 必须为ntext/nchar/nvarchar类型
2> @sql的参数赋值语句的前面必须用"N",转换为Unicode字符串
--定义一个游标 declare zb_cur cursor for select zb_gl.zb_sql_gs from zb_gl<br>--@zb_sql为动态sql,过参数 '@statement'。 declare @zb_sql nvarchar(2000) declare @ymd varchar(20) set @ymd='2019-1-1' --打开游标 open zb_cur while 0=0 begin --读取游标
请求出错错误代码400请尝试刷新页面重试
sqlserver动态 sql执行 execute和 sp_executesql,用动态 SQL语。 。。
sp_executesql的运用 书写语法要点: exec sp_executesql @sql,N’参数1 类型1,参数2 类型2,参数3 类型3 OUTPUT’,参数1,参数2,参数3 OUTPUT; 注意参数前后顺序必须对应好 如下图不同颜色的标记
简易测试代码:
declare @FSQL nVARCHAR(1000),@FF VARCHAR(100) SET @FSQL='SELECT @FF=''AA'' '
PRINT @FSQL exec sp_executesql @FSQL,N'@FF VARCHAR(100) OUT',@FF OUT SELECT @FF
fetch next from zb_cur into @zb_sql if @@FETCH_STATUS=0
SQLServer执行字符串语句
SQLServer执⾏字符串语句1.使⽤execute来执⾏字符串--使⽤Northwind数据库declare@sql nvarchar(200)set@sql='select * from customers'exec(@sql)注意:exec sql和exec(sql)是有区别的.exec sql是执⾏存储过程.exec(sql)是执⾏sql字符串语句.2.使⽤exec sp_executesql来执⾏字符串--使⽤Northwind数据库declare@sql nvarchar(200)set@sql='select * from customers'exec sp_executesql @sql传递参数:--使⽤SQLServer数据库--声明SQL字符串变量declare@sql nvarchar(max) ='';--1、执⾏SQL字符串形参和实参⼀⼀对应declare@contacttitle nvarchar(30) ='owner';set@sql='select * from customers where contacttitle=@contacttitle and CompanyName=@CompanyName';exec sp_executesql @sql,N'@contacttitle nvarchar(30),@CompanyName nvarchar(40)',@contacttitle=@contacttitle,@CompanyName='Bon app';--2、执⾏SQL字符串形参和实参以先后顺序对齐declare@id nvarchar(50) ='',@name nvarchar(50) ='';set@sql='SELECT TOP 1 @id = id FROM peoples WHERE name = @name';exec sp_executesql @sql,N'@id nvarchar(50) OUTPUT,@name nvarchar(50)',@id OUTPUT,@name INprint'得到 id :'+@id;现在来看exec sp_executesql的语法:sp_executesql [@stmt =] stmt[{, [@params =] N'@parameter_name data_type [,...n]' }{, [@param1 =]'value1'[,...n] }]我们注意到该存储过程的第⼀个参数是⽤来设置参数类型的,后⾯相应的才跟着参数的值.替换 sp_executesql 中的参数的能⼒,与使⽤ EXECUTE 语句执⾏字符串相⽐,有下列优点:1.因为在 sp_executesql 中,Transact-SQL 语句的实际⽂本在两次执⾏之间未改变,所以查询优化器应该能将第⼆次执⾏中的 Transact-SQL 语句与第⼀次执⾏时⽣成的执⾏计划匹配。
sql exec用法
sql exec用法在SQL语言中,EXEC是用来执行存储过程或批处理语句的关键字。
它可以将一个或多个参数作为输入,并返回结果集或输出参数。
EXEC语句是一种非常强大的工具,它可以帮助我们简化代码并提高效率。
下面是一些使用EXEC语句的示例:1. 执行存储过程:EXEC stored_procedure_name这个语句可以执行一个名为stored_procedure_name的存储过程。
如果存储过程需要输入参数,可以在语句后面添加参数列表,例如:EXEC stored_procedure_name @param1, @param22. 执行动态SQL语句:EXEC @sql_statement这个语句可以执行一个动态SQL语句,其中@sql_statement是一个字符串变量,表示要执行的SQL语句。
可以在@sql_statement中包含参数,例如:DECLARE @sql_statement NVARCHAR(100)SET @sql_statement = 'SELECT * FROM table WHERE id = @id' EXEC sp_executesql @sql_statement, N'@id int', @id3. 执行批处理语句:EXEC (batch_statement)这个语句可以执行一个批处理语句,其中batch_statement是一个包含多个SQL语句的字符串。
可以在batch_statement中使用GO 分隔符来分隔不同的语句块,例如:EXEC ('INSERT INTO table1 VALUES (1, ''value1''); GO SELECT * FROM table2')总之,SQL EXEC语句是一个非常有用的工具,可以帮助我们执行存储过程、动态SQL语句和批处理语句。
sql 动态表名
--如何将exec执行结果放入变量中?
declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
set @QueryString='select * from tablename '
insert into #tmp(field1,field2,...) exec(@querystirng)
exec sp_executesql @s -- 此句正确
3. 输入或输出参数
(1)输入参数:
declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
sql 动态表名
1 :普通SQL语句可以用Exec执行 例: Select * from tableName
Exec('select * from tableName')
