标签: sp-executesql

执行sp_executeSql以选择...到#table但不能选择临时表数据

试图在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)

怀疑它只在'选择'部分工作.插入不起作用.如何解决?

sql t-sql temp-tables sql-server-2008 sp-executesql

33
推荐指数
4
解决办法
6万
查看次数

具有多个参数的EXEC sp_executesql

如何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)

t-sql sql-server stored-procedures sp-executesql

33
推荐指数
2
解决办法
10万
查看次数

将exec sp_executesql转换为普通查询的简便方法?

在使用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 format macros ssms sp-executesql

28
推荐指数
4
解决办法
7239
查看次数

实体框架4.2 exec sp_executesql不使用索引(参数嗅探)

对于针对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)的跟踪标志,但是这似乎没有任何效果.

这给我留下了一些问题:

  1. 无论如何将OPTION(RECOMPILE)查询提示附加到Entity Framework生成的SQL?
  2. 反正有没有阻止Entity Framework使用exec sp_executesql,而只是运行原始SQL?
  3. 还有其他人遇到这个问题吗?还有其他提示/提示吗?

附加信息:

  1. 我确实通过SSMS重启了数据库实例,但是,我将尝试从服务管理控制台重新启动服务.
  2. 参数化设置为SIMPLE(is_parameterization_forced:0)
  3. 针对特殊工作负载进行优化具有以下设置
    • 值:0
    • 最小值:0
    • 最大值:1
    • value_in_use:0
    • is_dynamic:1
    • is_advanced:1

我还要提一下,如果我通过服务管理控制台重新启动SQL Server服务,在使用下面的脚本启用跟踪标志4136后,实际上似乎清除了跟踪标志...也许我应该以不同的方式这样做......

DBCC TRACEON(4136,-1)
Run Code Online (Sandbox Code Playgroud)

entity-framework parameter-sniffing sql-server-2008-r2 sp-executesql

24
推荐指数
2
解决办法
4448
查看次数

将TABLE变量传递给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)

哪个我不能直接进入临时变速器(对吧?)......

任何帮助赞赏!

sql dynamic sp-executesql

22
推荐指数
2
解决办法
4万
查看次数

是否可以使用带参数的sp_executesql发出CREATE语句?

我正在尝试动态创建触发器,但在使用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 …

sql-server dynamic-sql sp-executesql

13
推荐指数
1
解决办法
428
查看次数

在SQL Server中远程调用表值函数的解决方法存在更多问题

我有一组查询需要使用不同的参数多次运行,所以我把它包装在一个表值函数中.

需要从远程服务器调用该表值函数.不幸的是,链接服务器上的调用失败并出现错误:

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

12
推荐指数
1
解决办法
3万
查看次数

使用sp_executesql的非最佳执行计划

我在使用一些参数的sql select语句中遇到性能下降的问题,对于同一个查询,使用sp_executesql内联方式需要两倍的时间执行此选择.

问题是在sp_execute-way中sql server没有使用最佳执行计划.虽然计划不同,但似乎在两种情况下都正确使用了表的索引.我真的不明白为什么表现如此不同.

我的原始查询更复杂,但是为了弄清楚发生了什么,我将原始查询简化为具有3个表和2个连接的选择.主要区别在于最佳使用Hash Match,我真的不知道这个的含义但是我能看到的唯一区别.

最佳计划(哈希匹配,超过3秒)

在此输入图像描述

错误的计划(没有哈希匹配,索引与上面相同,超过12秒)

在此输入图像描述

  1. 我认为我的问题不是"参数嗅探",在我的情况下,对于所有不同的参数值,查询总是很慢,因为执行计划总是不正确的.

  2. OPTION (RECOMPILE)没有帮助,sp_executesql继续变慢和内联方式需要更多时间(因为查询总是编译执行计划)

  3. 表的统计信息已更新

  4. 我必须使用sp_executesql方式,因为似乎报告服务封装了select中的sp_executesql调用

有人知道为什么会sp_executesql生成与内联查询不同(错误)的执行计划吗?


编辑:查询没有使用相同的索引我想这是因为执行树不一样,sqlserver随意取索引,附加你可以找到新的执行计划强制使用相同的索引,性能现在甚至最差,从在慢查询中12秒到超过15分钟(我已取消).我真的没有兴趣以更快的速度运行这个特定的查询,因为我说这不是我正在处理的真正的查询,我想弄清楚的是为什么执行计划在内联查询和sp_executesql- 之间是如此不同查询.

这有什么神奇的选择sp_executesql吗?:)

最佳 在此输入图像描述

在此输入图像描述

sql-server reporting-services sp-executesql

11
推荐指数
1
解决办法
1435
查看次数

使用"执行sp_Executesql"时的权限

我有一个数据库,所有访问都由存储过程控制.DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的.因此,所有数据的更新和选择都是通过存储过程完成的.基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色.

问题是其中一个存储过程动态构建一个SQl查询并通过"Execute sp_Executesql"执行它.在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化.有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的.存储过程中引用的使用"执行sp_Executesql"的基础表需要被赋予"datareader"访问权限,否则存储过程将失败.

有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用"Execute sp_Executesq"l的存储过程.谢谢.

sql sql-server permissions dynamic-sql sp-executesql

8
推荐指数
2
解决办法
1万
查看次数

sp_executesql和表输出

我正在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年的任何一个.

sql sql-server-2005 sp-executesql

7
推荐指数
2
解决办法
2万
查看次数