如果目标数据库中存在表,我正在尝试签入存储过程。如果没有,我将使用源数据库中的 information_schema 表创建表。但是,当我使用 sp_execute 尝试恢复表是否存在时,我收到错误过程需要“int”类型的参数“@handle”。
我没有使用@handle 参数。有人能告诉我这个错误是什么意思以及为什么我会收到它吗?我的代码的相关部分如下。
DECLARE @SQL NVARCHAR(MAX),
@Parameters NVARCHAR(4000),
@TableNotExists INT,
@SourceTable NVARCHAR(200),
@DestDB NVARCHAR(200)
BEGIN
SET @SourceTable = 'table'
SET @DestDB = 'database'
SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT'
SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' AND TABLE_NAME = @SourceTableIN)
BEGIN SET @TableNotExistOUT = 1 END'
EXEC sp_Execute @SQL, @Parameters, @SourceTableIN = @SourceTable, @TableNotExistsOUt = @TableNotExists OUTPUT
END
Run Code Online (Sandbox Code Playgroud) 在 sql server 2012 中,我曾经通过获取 SP_HELP_JOB 的输出来查看作业
-- https://www.sqlservercentral.com/Forums/Topic259078-8-1.aspx
-- getting data from sp_help_job into a temp table
-- marcelo miorelli
-- 01-april-2013
IF OBJECT_ID('TEMPDB..#JOBiNFO') IS NOT NULL
DROP TABLE #JobInfo
IF OBJECT_ID('TEMPDB..#ScheduleInfo') IS NOT NULL
DROP TABLE #ScheduleInfo
SELECT * INTO #JobInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off exec msdb.dbo.sp_help_job -- @execution_status=4')
SELECT * INTO #ScheduleInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off exec msdb.dbo.sp_help_schedule')
Run Code Online (Sandbox Code Playgroud)
现在在 sql server 2016 上这不起作用。
我收到此错误消息:
消息 11520,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 …
考虑这样一种情况,我的所有模式名称都在一个表中,而我的所有表名称都在另一个表中。
是否可以执行以下操作(伪代码)?
SELECT value FROM (SELECT schema_name FROM schemas).(SELECT table_name FROM tables)
Run Code Online (Sandbox Code Playgroud)
或者我必须将查询分解为三个 SELECT 吗?
背景:我们的一些默认列约束是在没有明确名称的情况下生成的,因此我们得到了因服务器而异的有趣名称,例如: DF__User__TimeZoneIn__5C4D869D
我希望它们都可以使用一致的命名进行管理,DF_Users_TimeZoneInfo这样我们就可以确保未来的目标表存在适当的约束(比如在 RedGate 比较中,甚至只是在视觉上)
我有一个主要适用于我想要的脚本:
select 'sp_rename N''[' + s.name + '].[' + d.name + ']'',
N''[DF_' + t.name + '_' + c.name + ']'', ''OBJECT'';'
from sys.tables t
join
sys.default_constraints d
on d.parent_object_id = t.object_id
join
sys.columns c
on c.object_id = t.object_id
and c.column_id = d.parent_column_id
join sys.schemas s
on t.schema_id = s.schema_id
WHERE d.NAME like 'DF[_][_]%'
Run Code Online (Sandbox Code Playgroud)
但这只是给了我一个结果集,而不是我实际上可以传递给 exec 或其他任何东西的东西。
我怎样才能做到这一点,以便我可以只执行这些sp_rename脚本,而不必求助于复制所有返回的元素并将它们粘贴到新的查询窗口中并再次运行它们?尝试尽可能多地保存击键,以便我可以在许多环境中纠正此问题。

问题的核心:实际存储过程是实现临时表缓存的唯一机制还是系统存储过程(例如sp_executeSQL/sp_execute也利用它们)?
我不是 DBA,所以请少说几句。我们的应用程序发送准备好的语句,从分析器中,我看到运行所有 SQL,sp_prepexec它是运行sp_prepare和sp_execute. 我想要做的是弄清楚我是否从临时表缓存中受益。
我一直在使用带有 object_id() 的本指南来检查行为
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
然后这篇博文中的第 3 点表明 EXEC 不能使用临时表缓存,但忽略了 sp_executeSQL 是否可以:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
在我通过客户端发送的查询中,我创建了一个简单的临时表。
DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement
SELECT 1 AS id
INTO #tmp
SELECT OBJECT_ID('tempdb..#tmp');
Run Code Online (Sandbox Code Playgroud)
在探查器中,我可以看到:
declare @p1 int
set @p1=NULL
exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1
SELECT 1 as id
into #tmp
select Object_id(''tempdb..#tmp'');
DROP TABLE #tmp;',1 …Run Code Online (Sandbox Code Playgroud) sql-server stored-procedures dynamic-sql prepared-statement temporary-tables
我有一系列 ETL 作业,在这些作业中我swap使用CREATE TABLE table1_swap LIKE table1. 为了使填充table1_swap更快,我不包括索引。但是,当我完成加载时,我需要将这些索引重新应用于新填充的表。这些索引是在这些 ETL 作业范围之外创建的,因此CREATE INDEX如果我不需要,我宁愿不必对调用进行硬编码。
是否可以将一组索引从一个表“转移”或“复制”到另一个表?
假设我有一个名为 的表people,其中id是主键:
+-----------+---------+---------+
| id | fname | lname |
| (integer) | (text) | (text) |
+===========+=========+=========+
| 1 | Daniel | Edwards |
| 2 | Fred | Holt |
| 3 | Henry | Smith |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。
我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:
INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加一age列,则需要修改查询以同时考虑年龄列。
显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint-- 而且,无论如何我都不希望它们共享相同的 ID:
INSERT INTO people …Run Code Online (Sandbox Code Playgroud) 问题/问题:获取错误: [Err] 1615 - Prepared statement needs to be re-prepared
我有一个存储过程,其中包含一个准备好的语句和一个视图
DROP PROCEDURE IF EXISTS `sampleProc`;
DELIMITER ;;
CREATE DEFINER = `root`@`localhost` PROCEDURE `sampleProc`()
BEGIN
SET @select = "SELECT * FROM `viewSample` ";
PREPARE stmt FROM @select ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt ;
END ;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
以下调用有时会出错 CALL sampleProc();
可能的解决方法/解决方案
看来最好的解决方案是增加 table_definition_cache 的值,但似乎不起作用,因为它已经从 1400(默认)增加到 16384。 table_open_cache 也增加到 32162
Variable_name Value
table_definition_cache 16384
table_open_cache 32162
table_open_cache_instances 4
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2014。我想执行EXEC (@remotecmd) AT [server_name];(@remotecmd 是动态 sql 而不是存储过程)到##eapb. 我的代码是
insert into ##eapb
EXEC (@remotecmd) AT [ADSQLDB3S\DEV];
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
链接服务器“server_name”的 OLE DB 访问接口“SQLNCLI11”返回消息“事务管理器已禁用对远程/网络事务的支持。”。
消息 7391,级别 16,状态 2,第 71 行
由于链接服务器“server_name”的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务,因此无法执行该操作。
如果我删除insert into ##eapb,我没有错误。
链接服务器的RPC Out选项设置为True。
以下是使用sp_executesql的动态过滤解决方案
IF OBJECT_ID(N'dbo.GetOrders', N'P') IS NOT NULL DROP PROC dbo.GetOrders;
GO
CREATE PROC dbo.GetOrders
@orderid AS INT = NULL,
@custid AS INT = NULL,
@empid AS INT = NULL,
@orderdate AS DATE = NULL
AS
DECLARE @sql AS NVARCHAR(1000);
SET @sql =
N'SELECT orderid, custid, empid, orderdate, filler'
+ N' /* 27702431-107C-478C-8157-6DFCECC148DD */'
+ N' FROM dbo.Orders'
+ N' WHERE 1 = 1'
+ CASE WHEN @orderid IS NOT NULL THEN
N' AND orderid = @oid' ELSE N'' END …Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
sql-server ×6
postgresql ×3
t-sql ×2
ddl ×1
index ×1
jobs ×1
mysql ×1
mysql-5.6 ×1
openrowset ×1
plpgsql ×1
view ×1