试图在sp_Executedsql中选择...到临时表#TempTable.不是它成功插入或没有,但有消息写入(359行受影响)意味着成功插入?下面的脚本
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable
from SPCTable with(nolock)
where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To';
SET @Sql = 'DECLARE @Date_From VARCHAR(10);
DECLARE @Date_To VARCHAR(10);
SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
'+ @Sql;
EXECUTE sp_executesql @Sql;
Run Code Online (Sandbox Code Playgroud)
执行后,它返回我的消息(359行受影响).接下来尝试从#TempTable中选择数据时.
Select * From #TempTable;
Run Code Online (Sandbox Code Playgroud)
它回报我:
Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.
Run Code Online (Sandbox Code Playgroud)
怀疑它只在'选择'部分工作.插入不起作用.如何解决?
如何EXEC sp_executesql正确地将参数传递给语句?
这就是我现在所拥有的,但是我遇到了错误:
alter PROCEDURE [dbo].[usp_getReceivedCases]
-- Add the parameters for the stored procedure here
@LabID int,
@RequestTypeID varchar(max),
@BeginDate date,
@EndDate date
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @statement nvarchar(4000)
set @statement = N'select SentToLab,
FROM dbo.vEmailSent
WHERE SentToLab_ID=@LabID and convert(date,DateSent) >= @BeginDate
and CONVERT(date, datesent) <= @EndDate
and RequestType_ID in ( @RequestTypeID )
EXEC sp_executesql @statement,N'@LabID int', @LabID, N'@BeginDate date', …Run Code Online (Sandbox Code Playgroud) 在使用Profiler和SSMS处理调试查询时,我很常见的是从Profiler复制查询并在SSMS中测试它们.因为我使用参数化的sql,我的查询都是作为exec sp_executesql查询发送的.
exec sp_executesql
N'/*some query here*/',
N'@someParameter tinyint',
@ someParameter =2
Run Code Online (Sandbox Code Playgroud)
我将把它转换成普通的查询以便于编辑(智能感知,错误检查,行号等):
DECLARE @someParameter tinyint
SET @someParameter = 2
/*some query here*/
Run Code Online (Sandbox Code Playgroud)
当然,查询越大越复杂,就越难做到这一点.当你多次来回走动时,它可能是一个痛苦的屁股,并吸收大量的时间.
是否有一种简单的(例如,宏命令)方式将muh executionql转换为更方便的东西?
对于针对SQL Server 2008 R2运行的实体框架(4.2)生成的简单SQL查询,我遇到了一些主要的性能问题.在某些情况下(但不是全部),EF使用以下语法:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1...
Run Code Online (Sandbox Code Playgroud)
在其他情况下,只需执行原始SQL,并将提供的参数烘焙到查询中.我遇到的问题是使用sp_executesql执行的查询忽略了目标表上的所有索引,导致执行查询极差(通过检查SSMS中的执行计划来确认).
经过一些研究,听起来这个问题可能是由"参数嗅探"造成的.如果我附加OPTION(RECOMPILE)查询提示,如下所示:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1...
Run Code Online (Sandbox Code Playgroud)
使用目标表上的索引,并且查询执行速度非常快.我还尝试在数据库实例(http://support.microsoft.com/kb/980653)上切换用于禁用参数嗅探(4136)的跟踪标志,但是这似乎没有任何效果.
这给我留下了一些问题:
附加信息:
我还要提一下,如果我通过服务管理控制台重新启动SQL Server服务,在使用下面的脚本启用跟踪标志4136后,实际上似乎清除了跟踪标志...也许我应该以不同的方式这样做......
DBCC TRACEON(4136,-1)
Run Code Online (Sandbox Code Playgroud) entity-framework parameter-sniffing sql-server-2008-r2 sp-executesql
我正在尝试将TABLE变量传递给sp_executesql过程:
DECLARE @params NVARCHAR(MAX)
SET @params = '@workingData TABLE ( col1 VARCHAR(20),
col2 VARCHAR(50) )'
EXEC sp_executesql @sql, @params, @workingData
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'TABLE'.
Run Code Online (Sandbox Code Playgroud)
我尝试在'TABLE'之后省略列规范.我还尝试将表声明为动态SQL中的变量.但没有运气......
在我看来,TABLE变量不允许在此过程中作为参数传递?顺便说一句:我正在运行MSSQL2008 R2.
我对使用像#workingData这样的本地临时表不感兴趣,因为我从另一个过程加载了工作数据:
INSERT INTO @workingData
EXEC myProc @param1, @param2
Run Code Online (Sandbox Code Playgroud)
哪个我不能直接进入临时变速器(对吧?)......
任何帮助赞赏!
我正在尝试动态创建触发器,但在使用sp_executesql参数并将参数传递到动态SQL时遇到了一个令人困惑的问题.以下简单测试用例有效:
DECLARE @tableName sysname = 'MyTable';
DECLARE @sql nvarchar(max) = N'
CREATE TRIGGER TR_' + @tableName + N' ON ' + @tableName + N' FOR INSERT
AS
BEGIN
PRINT 1
END';
EXEC sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够@tableName在脚本中使用(和其他值)作为变量,因此我将其传递给sp_executesql调用:
DECLARE @tableName sysname = 'ContentItems';
DECLARE @sql nvarchar(max) = N'
CREATE TRIGGER TR_' + @tableName + N' ON ' + @tableName + N' FOR INSERT
AS
BEGIN
PRINT @tableName
END';
EXEC sp_executesql @sql, N'@tableName sysname', @tableName=@tableName
Run Code Online (Sandbox Code Playgroud)
运行上面的代码时,我收到一个错误:
Msg 156,Level …
我有一组查询需要使用不同的参数多次运行,所以我把它包装在一个表值函数中.
需要从远程服务器调用该表值函数.不幸的是,链接服务器上的调用失败并出现错误:
Msg 4122, Level 16, State 1, Line 29
Remote table-valued function calls are not allowed.
Run Code Online (Sandbox Code Playgroud)
Microsoft已承认"远程调用表值函数"是SQL Server 2008中遗漏的一项功能.请参阅:http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function -calls-是-不被允许
我发现了一种使用OPENQUERY语法的解决方法,它允许查询在远程服务器上本地运行,然后返回结果集.请参阅:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd
不幸的是,这个解决方法需要一个解决方法,因为它需要一个字符串作为参数,这意味着你不能使用OPENQUERY语法传递一个变量,你甚至不能在其中连接一个字符串,就像你想要包含你的变量一样想要传递给远程表值函数.解决方法的解决方法是使用动态SQL显式构建OPENQUERY查询,确保将正常的字符串传递给它.请参阅:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/
然而,另一个问题是由此产生的.即使确保所有引号和双引号和四引号都正确嵌入,因此整个事件可以通过exec sp_executesql传递,但仍然存在问题:
当查询最终调用表值函数时,我得到错误:
OLE DB provider "SQLNCLI10" for linked server "MY_REMOTE_SERVER_NAME" returned message "Deferred prepare could not be completed.".
Msg 7416, Level 16, State 1, Procedure MyTableValuedFunctionName, Line 22
Access to the remote server is denied because no login-mapping exists.
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我收到此错误,因为我的用户名存在映射,如果我只是用实际表替换表值函数,它会返回结果.OPENQUERY语句出现问题,无论是否使用sp_executesql执行,并且正如我所说,它只在调用表值函数时发生.
任何想法如何解决这个问题?
permissions linked-server openquery sql-server-2008 sp-executesql
我在使用一些参数的sql select语句中遇到性能下降的问题,对于同一个查询,使用sp_executesql内联方式需要两倍的时间执行此选择.
问题是在sp_execute-way中sql server没有使用最佳执行计划.虽然计划不同,但似乎在两种情况下都正确使用了表的索引.我真的不明白为什么表现如此不同.
我的原始查询更复杂,但是为了弄清楚发生了什么,我将原始查询简化为具有3个表和2个连接的选择.主要区别在于最佳使用Hash Match,我真的不知道这个的含义但是我能看到的唯一区别.
最佳计划(哈希匹配,超过3秒)
错误的计划(没有哈希匹配,索引与上面相同,超过12秒)

我认为我的问题不是"参数嗅探",在我的情况下,对于所有不同的参数值,查询总是很慢,因为执行计划总是不正确的.
OPTION (RECOMPILE)没有帮助,sp_executesql继续变慢和内联方式需要更多时间(因为查询总是编译执行计划)
表的统计信息已更新
我必须使用sp_executesql方式,因为似乎报告服务封装了select中的sp_executesql调用
有人知道为什么会sp_executesql生成与内联查询不同(错误)的执行计划吗?
编辑:查询没有使用相同的索引我想这是因为执行树不一样,sqlserver随意取索引,附加你可以找到新的执行计划强制使用相同的索引,性能现在甚至最差,从在慢查询中12秒到超过15分钟(我已取消).我真的没有兴趣以更快的速度运行这个特定的查询,因为我说这不是我正在处理的真正的查询,我想弄清楚的是为什么执行计划在内联查询和sp_executesql- 之间是如此不同查询.
这有什么神奇的选择sp_executesql吗?:)
最佳

慢

我有一个数据库,所有访问都由存储过程控制.DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的.因此,所有数据的更新和选择都是通过存储过程完成的.基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色.
问题是其中一个存储过程动态构建一个SQl查询并通过"Execute sp_Executesql"执行它.在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化.有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的.存储过程中引用的使用"执行sp_Executesql"的基础表需要被赋予"datareader"访问权限,否则存储过程将失败.
有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用"Execute sp_Executesq"l的存储过程.谢谢.
我正在SQL Server 2005中编写存储过程,在给定点我需要执行另一个存储过程.这个调用是动态的,所以我像往常一样使用sp_executesql命令:
DECLARE @DBName varchar(255)
DECLARE @q varchar(max)
DECLARE @tempTable table(myParam1 int, -- other params)
SET @DBName = 'my_db_name'
SET q = 'insert into @tempTable exec ['+@DBName+'].[dbo].[my_procedure]'
EXEC sp_executesql @q, '@tempTable table OUTPUT', @tempTable OUTPUT
SELECT * FROM @tempTable
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
必须声明标量变量"@tempTable".
如您所见,声明了变量.我已阅读文档,似乎只允许参数是text,ntext和image.我怎么能拥有我需要的东西?
PS:我已经找到了许多关于2008和更多版本的技巧,2005年的任何一个.
sp-executesql ×10
sql-server ×5
sql ×4
dynamic-sql ×2
permissions ×2
t-sql ×2
dynamic ×1
format ×1
macros ×1
openquery ×1
ssms ×1
temp-tables ×1