天道酬勤,学无止境

在 T-SQL 中结合存储过程和查询(Combine stored procedure and query in T-SQL)

问题

如何在常规 SQL 查询中结合执行存储过程和使用其结果或参数?

例如,我想做如下事情:

-- passing result of SELECT to SP
SELECT a, b FROM t
EXEC my_sp a, b

-- passing result of SP to INSERT    
INSERT INTO t
EXEC my_sp a, b

等等。

回答1

不,您需要使用临时表

create table #results (col1 int, col2 varchar(5) ...)

INSERT INTO #results
   EXEC YourProcedure @parma...

然后你可以加入它

SELECT
    *
    FROM YourTable     y
        JOIN #results  r ON ...
    ....

如果您不知道过程中的列和数据类型,您可以使用这个优秀的答案:将存储过程的结果插入临时表

简而言之,它使用OPENROWSET将存储过程执行到动态创建的 #temp 表中,而无需命名和知道所有列的类型。

回答2

如果您的 SP 可以重写为内联表值 UDF,则这些通常性能非常好并且等效于参数化视图。 ITVF 可用于任何需要使用表或视图的地方。

如果您的 SP 不能作为内联 TVF(需要局部变量操作)工作,则它可能作为多语句 TVF(包含 BEGIN/END)工作,这可能会或可能不会表现不佳,具体取决于您必须做什么。

在您的 SP 变成 UDF 之后,您仍然可以从您的 SP (SELECT* FROM udf(params)) 或其他地方调用 UDF,它可用于连接等,因此您的所有代码都在 UDF 中 - 不复制。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在T-SQL存储过程中使用可选参数?(How can I use optional parameters in a T-SQL stored procedure?)
    问题 我正在创建一个存储过程以通过表进行搜索。 我有许多不同的搜索字段,所有这些都是可选的。 有没有一种方法可以创建可以处理此问题的存储过程? 假设我有一个包含四个字段的表:ID,FirstName,LastName和Title。 我可以做这样的事情: CREATE PROCEDURE spDoSearch @FirstName varchar(25) = null, @LastName varchar(25) = null, @Title varchar(25) = null AS BEGIN SELECT ID, FirstName, LastName, Title FROM tblUsers WHERE FirstName = ISNULL(@FirstName, FirstName) AND LastName = ISNULL(@LastName, LastName) AND Title = ISNULL(@Title, Title) END 这种作品。 但是,它将忽略FirstName,LastName或Title为NULL的记录。 如果在搜索参数中未指定“标题”,则我要包括“标题”为NULL的记录-“名字”和“姓氏”相同。 我知道我可以使用动态SQL来做到这一点,但我想避免这种情况。 回答1 根据给定的参数动态更改搜索是一个复杂的主题,并且即使只有很小的不同
  • 在T-SQL存储过程中动态检索参数名称和当前值(Dynamically Retrieve Parameter Names & Current Values Inside T-SQL Stored Procedure)
    问题 我有数百个用于商业智能的模板化ETL存储过程。 他们将其操作活动记录到审核表中。 缺少的一件事是记录传递给它们的参数信息。 问题在于从一个SP到另一个SP的参数并不总是相同的。 我正在寻找一个标准代码段,我可以将其插入可以遍历proc的所有参数并检索传入的当前值的过程中。我计划将它们混成一个字符串以也记录到表中。 有任何想法吗? 预先感谢您提供任何指导! -蒂姆 回答1 您不必动态检索存储的proc内部的名称和参数,因为一旦创建或更改了存储的proc,它就无法更改其参数,除非再次对其进行更改或重新创建。 相反,您可能在存储的proc static中具有参数列表,但是为了不手动枚举参数,可以让DDL触发器动态生成它。 定义一些注释标记,这些标记将用于标记应在存储过程中列出参数的位置,并在适当的地方将其添加到存储过程的主体中。 触发器应找到标记并在proc之间插入参数名称及其值的静态列表。 示例如下。 DDL触发 create trigger StoredProc_ListParams on database for CREATE_PROCEDURE, ALTER_PROCEDURE as begin set nocount on; if @@nestlevel > 1 return; declare @evt xml, @sch sysname, @obj sysname,
  • T-SQL如何在存储过程中动态创建表?(T-SQL How to create tables dynamically in stored procedures?)
    问题 像这样的代码,但这是错误的: CREATE PROC sp_createATable @name VARCHAR(10), @properties VARCHAR(500) AS CREATE TABLE @name ( id CHAR(10) PRIMARY KEY, --...Properties extracted from @properties ); 你能告诉我如何处理吗? 真的让我感到困扰。 回答1 您正在使用表变量,即应声明表。 这不是临时表。 您可以这样创建一个临时表: CREATE TABLE #customer ( Name varchar(32) not null ) 您可以像这样声明一个表变量: DECLARE @Customer TABLE ( Name varchar(32) not null ) 注意,临时表使用#声明,表变量使用@声明。 阅读有关表变量和临时表之间的区别的信息。 更新: 根据下面的评论,您实际上正在尝试在存储过程中创建表。 为此,您将需要使用动态SQL。 基本上,动态SQL允许您以字符串形式构造SQL语句,然后执行它。 这是您将能够在存储过程中创建表的唯一方法。 我将向您展示如何进行讨论,然后讨论为什么这通常不是一个好主意。 现在来看一个简单的示例(我尚未测试此代码,但是它应该为您提供了一个很好的指示): CREATE
  • 验证T-SQL查询的方法?(Ways to validate T-SQL queries?)
    问题 我可以访问Access数据库,并且在该数据库中填充了TSQL查询的字段。 这些查询由服务器上的T-SQL处理。 因此,当我编写这些SQL查询并将其放入供最终服务器使用的字段中时,我无法验证语法/等。 我可以在该Access数据库中创建一个临时查询,但这不是相同的查询语言。 例如,Access会正确使用IIF但TSQL不会(使用CASE )。 我没有使用TSQL直接访问该服务器的方法,有没有一种方法可以验证我的T-SQL查询(用于语法等)? 也许是在线的在线工具? 我应该注意我没有访问SQL Server的权限。 仅Access数据库,仅此而已。 我知道它不会验证表名之类的东西,我不希望如此。 回答1 实际上,应结合使用MattMc3的答案和FremenFreedom的答案。 下载SQL Express。 然后,声明以下存储过程: create procedure IsValidSQL (@sql varchar(max)) as begin begin try set @sql = 'set parseonly on;'+@sql; exec(@sql); end try begin catch return(1); end catch; return(0); end; -- IsValidSQL 您可以使用以下方法进行测试: declare @retval int
  • 在SQL Server Management Studio中调试存储过程(Debugging stored procedures in SQL Server Management Studio)
    问题 有没有办法进入SQL Server Management Studio中的存储过程代码? 我知道Visual Studio可以做到这一点,但我正在从Management Studio中寻找可靠的调试解决方案 回答1 仅适用于SQL 2008和SSMS2008。从菜单“调试\开始调试”中选择或按Alt + F5,将逐步启动T-SQL调试器。 在2005年,唯一的方法是附加Profiler并监视SP:StmtCompleted事件,这不是一步一步的调试程序,但至少您会看到执行流程。 显然,这不是在生产机器上完成的。 回答2 我在这里写了一篇非常详细的博客文章: http://www.diaryofaninja.com/blog/2010/11/23/debugging-sql-queries-function-amp-stored-procedures-with-sql-management-studio 基本上,要点是您输入sql查询以执行存储过程,而不是按F5或单击感叹号,而是单击播放按钮,并使用F10和F11逐步进入存储过程。 这非常方便,但似乎没人使用它。 回答3 SQL Server 2000的查询分析器中没有调试sproc的功能,SQL Server 2005中没有该功能。Microsoft意识到了这个错误,并在SQL Server 2008中重新使用了该功能。
  • 将存储过程的结果插入临时表(Insert results of a stored procedure into a temporary table)
    问题 如何SELECT * INTO [temp table] FROM [stored procedure]进行SELECT * INTO [temp table] FROM [stored procedure] ? 不是FROM [Table] ,也没有定义[temp table] ? 从BusinessLine Select所有数据到tmpBusLine可以正常工作。 select * into tmpBusLine from BusinessLine 我正在尝试相同的方法,但是使用返回数据的stored procedure并不完全相同。 select * into tmpBusLine from exec getBusinessLineHistory '16 Mar 2009' 输出信息: 消息156,级别15,状态1,第2行关键字“ exec”附近的语法错误。 我已经阅读了几个创建与输出存储过程具有相同结构的临时表的示例,该示例工作正常,但是最好不要提供任何列。 回答1 您可以为此使用OPENROWSET。 看一看。 我还包括了sp_configure代码,以启用临时分布式查询(如果尚未启用)。 CREATE PROC getBusinessLineHistory AS BEGIN SELECT * FROM sys.databases END GO sp
  • 测量执行t-sql查询所需的时间(Measure the time it takes to execute a t-sql query)
    问题 我有两个使用SqlServer 2005的t-sql查询。如何测量每个查询运行多长时间? 使用我的秒表不会削减它。 回答1 测量事件之间的“经过时间”的一种简单方法是仅获取当前日期和时间。 在SQL Server Management Studio中 SELECT GETDATE(); SELECT /* query one */ 1 ; SELECT GETDATE(); SELECT /* query two */ 2 ; SELECT GETDATE(); 要计算经过的时间,您可以将这些日期值转换为变量,然后使用DATEDIFF函数: DECLARE @t1 DATETIME; DECLARE @t2 DATETIME; SET @t1 = GETDATE(); SELECT /* query one */ 1 ; SET @t2 = GETDATE(); SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms; SET @t1 = GETDATE(); SELECT /* query two */ 2 ; SET @t2 = GETDATE(); SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms; 那只是一种方法。 您还可以使用SQL事件探查器获得查询的经过时间。 回答2
  • LINQ-to-SQL与存储过程? [关闭](LINQ-to-SQL vs stored procedures? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我看了一下StackOverflow上的“ LINQ入门指南”(LINQ入门指南),但是有一个后续问题: 我们将要启动一个新项目,其中几乎所有数据库操作都将是相当简单的数据检索(该项目的另一部分已经在写数据了)。 到目前为止,我们的大多数其他项目都使用存储过程来处理此类事情。 但是,如果更有意义,我想利用LINQ-to-SQL。 因此,问题是这样的:对于简单的数据检索,LINQ-to-SQL或存储的proc哪种方法更好? 任何特定的赞成或反对? 谢谢。 回答1 LINQ优于sproc的一些优点: 类型安全性:我认为我们都理解这一点。 抽象:对于LINQ-to-Entities尤其如此。 这种抽象还允许框架添加可以轻松利用的其他改进。 PLINQ是向LINQ添加多线程支持的一个示例。 最小的代码更改即可添加此支持。 做这种简单地调用sproc的数据访问代码要困难得多。 调试支持:我可以使用任何.NET调试器来调试查询。 使用sproc,您将无法轻松调试SQL,并且这种经验很大程度上取决于数据库供应商(MS SQL Server提供了查询分析器
  • T-SQL:无法将串联字符串作为参数传递给存储过程(T-SQL: Cannot pass concatenated string as argument to stored procedure)
    问题 场景:需要将n个参数传递给存储过程。 参数之一是varchar(x)类型。 该varchar参数需要从其他几个varchar变量中构造出来。 此问题使用SQL Server 2005,但是此行为适用于所有版本的SQL Server。 设置: DECLARE @MyString varchar(500), @MyBar varchar(10), @MyFoo varchar(10) SELECT @MyBar= 'baz ' SELECT @MyFoo= 'bat ' -- try calling this stored procedure! EXEC DoSomeWork @MsgID, 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".' 这会在SQL Server中产生异常: Incorrect syntax near '+' 。 通常,您可能会认为数据类型是错误的(即变量属于不同类型,但是会产生不同的错误消息)。 这是可以正确编译的正确实现: SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".'; EXEC DoSomeWork @ID, @MyString 问题:为什么T-SQL无法将varchar的串联作为参数处理? 它知道类型
  • T-SQL获取存储过程的SELECTED值(T-SQL get SELECTed value of stored procedure)
    问题 在T-SQL中,这是允许的: DECLARE @SelectedValue int SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 因此,有可能获得SELECT的值并将其填充到变量中(显然,如果它是标量的)。 如果我将相同的选择逻辑放入存储过程中: CREATE PROCEDURE GetMyInt AS SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1 我可以获取此存储过程的输出并将其填充到变量中吗? 就像是: DECLARE @SelectedValue int SELECT @SelectedValue = EXEC GetMyInt (我知道上面的语法是不允许的,因为我尝试了!) 回答1 您可以使用三种方式:RETURN值,OUTPUT参数和结果集 另外,请注意是否使用以下模式: SELECT @Variable=column FROM table ... 如果查询返回了多行,则@Variable将仅包含查询返回的最后一行的值。 返回值因为您的查询至少根据您的命名方式返回一个int字段。 您可以使用以下技巧: CREATE PROCEDURE GetMyInt ( @Param int) AS
  • 如何在创建存储过程之前检查它是否存在(How to check if a stored procedure exists before creating it)
    问题 我有一个SQL脚本,每当客户端执行“数据库管理”功能时,都必须运行该脚本。 该脚本包括在客户端数据库上创建存储过程。 这些客户端中的某些客户端在运行脚本时可能已经具有存储过程,而某些客户端可能没有。 我需要将丢失的存储过程添加到客户端数据库中,但是我尝试修改T-SQL语法的大小无关紧要, CREATE / ALTER PROCEDURE'必须是查询批处理中的第一条语句 在创建作品之前,我已经读过这些内容,但是我不喜欢那样做。 IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc') DROP PROCEDURE MyProc GO CREATE PROCEDURE MyProc ... 我如何添加检查存储过程的存在并创建它(如果不存在),但是更改它(如果存在)呢? 回答1 您可以在任何能够运行查询的地方运行过程代码。 只需在AS之后复制所有内容: BEGIN DECLARE @myvar INT SELECT * FROM mytable WHERE @myvar ... END 此代码执行的操作与存储的proc完全相同,但不存储在数据库端。 这很像PL/SQL所谓的匿名过程。 更新: 您的问题标题有点令人困惑。 如果您只需要创建一个不存在的过程,那么您的代码就可以了。
  • 编写sql存储过程的最佳实践是什么?(What are the best practices in writing a sql stored procedure [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 7个月前关闭。 改善这个问题 我发现SQL存储过程非常有趣且有用。 我已经编写了存储过程,但是我想针对任何要求编写精巧,性能良好且精简的SP,并且还希望了解存储过程的任何技巧或好的做法。 在编写存储过程时,我如何从初学者过渡到高级阶段? 更新:从评论中发现我的问题应该更具体。 每个人都袖手旁观,我期待他们在代码中使用这些SP的技巧和实践,这将它们与其他人区分开,更重要的是提高了编写和使用存储过程的效率。 回答1 这是我的存储过程错误处理准则。 使用其完全限定名称调用每个存储过程以提高性能:即服务器名称,数据库名称,架构(所有者)名称和过程名称。 在创建每个存储过程的脚本中,明确指定允许哪些角色执行该过程,例如public或其他。 使用sysmessage,sp_addmessage和占位符,而不要使用硬编码的错误消息。 使用sp_addmessage和sysmessages时,请始终使用50001或更大的错误消息号。 使用RAISERROR时,请始终为警告消息提供严重性级别<= 10。 对于RAISERROR,始终为错误消息提供11到16之间的严重级别。 请记住,即使在触发器上下文中,使用RAISERROR也不总是中止正在进行的任何批处理。
  • 接受多个Id值的T-SQL存储过程(T-SQL stored procedure that accepts multiple Id values)
    问题 是否有一种优美的方式来处理将ID列表作为参数传递给存储过程? 例如,我希望存储过程返回部门1、2、5、7、20。 过去,我像下面的代码一样,以逗号分隔的id列表进行了传递,但是这样做确实感到很脏。 我认为SQL Server 2005是我唯一适用的限制。 create procedure getDepartments @DepartmentIds varchar(max) as declare @Sql varchar(max) select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')' exec(@Sql) 回答1 在过去的16年中,Erland Sommarskog一直对这个问题保持权威性的答案: SQL Server中的数组和列表。 至少有十二种方法可以将数组或列表传递给查询。 每个人都有自己独特的优点和缺点。 表值参数。 仅限于SQL Server 2008和更高版本,并且可能是最接近通用的“最佳”方法。 迭代方法。 传递一个定界字符串并循环通过它。 使用CLR。 SQL Server 2005及更高版本(仅来自.NET语言)。 XML。 非常适合插入许多行; 可能对SELECT来说太过分了。 数字表。 比简单的迭代方法更高的性能/复杂度。
  • 验证T-SQL存储过程的可靠方法(A reliable way to verify T-SQL stored procedures)
    问题 我们正在从SQL Server 2005升级到2008。几乎将2005实例中的每个数据库都设置为2000兼容模式,但是我们正在跳至2008。我们的测试已经完成,但是我们了解到,我们需要获取更快。 我发现了一些存储过程,这些存储过程要么从丢失的表中选择数据,要么尝试对不存在的列进行ORDER BY列。 包装SQL以在SET PARSEONLY ON中创建过程,并在try / catch中捕获错误只能捕获ORDER BY中的无效列。 从丢失的表中选择数据的过程找不到错误。 但是,SSMS 2008的智能感知确实可以找到问题,但是我仍然可以继续并成功运行该程序的ALTER脚本,而不会抱怨。 那么,为什么我什至无法创建一个在运行时失败的过程呢? 有没有比我尝试过的工具更好的工具? 我发现的第一个工具不是很有用:来自CodeProject的DbValidator,但是它发现的问题比我在SqlServerCentral上发现的脚本无效的问题要少,后者发现了无效的列引用。 ------------------------------------------------------------------------- -- Check Syntax of Database Objects -- Copyrighted work. Free to use as a tool to check
  • T-SQL遍历查询结果(T-SQL loop over query results)
    问题 我select @id=table.id from table运行查询select @id=table.id from table ,我需要遍历结果,以便可以为每行exec stored_proc @varName=@id,@otherVarName='test'存储过程exec stored_proc @varName=@id,@otherVarName='test' 如何在T-SQL脚本中执行此操作? 回答1 在这种情况下,您可以使用CURSOR: DECLARE @id INT DECLARE @name NVARCHAR(100) DECLARE @getid CURSOR SET @getid = CURSOR FOR SELECT table.id, table.name FROM table OPEN @getid FETCH NEXT FROM @getid INTO @id, @name WHILE @@FETCH_STATUS = 0 BEGIN EXEC stored_proc @varName=@id, @otherVarName='test', @varForName=@name FETCH NEXT FROM @getid INTO @id, @name END CLOSE @getid DEALLOCATE @getid 修改以显示表中的多个参数
  • 如何使用接受分页参数的存储过程(How to use Stored Procedure that accepts Paging Parameters)
    问题 使用微风时如何使用存储过程的任何链接示例,主要是找出如何提取分页参数和设置 inlinecount 值,因为存储过程将返回该值并采用分页参数。 IE function GetData(int Pageindex,int PageSize, string SP_Input_Para1,string SP_Input_Para2 等等.... 类似地更新 function Update(string SP_Input_Param1, string SP_Input_Param2 etc) 然后一些如何配置 Breeze 来告诉它应该在服务器上使用以下函数来获取和更新、删除、插入等。 或者更好的方法可能是 For Get 使用 Request 和 Response 作为自定义结构 i.e public class MyResponse { public IEnumerable<Object> Results { get; set; } public string Message { get; set; } } public class MyRequest { public PagingInfo pageInfo { get; set; } public ParameterInfo Parameters { get; set; } } public class PagingInfo
  • 从存储过程的结果集中选择列(Select columns from result set of stored procedure)
    问题 我有一个存储过程,该过程返回80列和300行。 我想写一个选择,使这些列中有2个。 就像是 SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2' 当我使用以上语法时,出现错误: “无效的列名”。 我知道最简单的解决方案是更改存储过程,但我没有编写它,也无法更改它。 有什么办法可以做我想要的吗? 我可以制作一个临时表来放入结果,但是因为有80列,所以我需要制作一个80列的临时表才能得到2列。 我想避免跟踪所有返回的列。 我按照Mark的建议尝试使用WITH SprocResults AS .... ,但出现2个错误关键字“ EXEC”附近的语法不正确。 ')'附近的语法不正确。 我尝试声明一个表变量,但出现以下错误插入错误:列名或提供的值数与表定义不匹配如果我尝试SELECT * FROM EXEC MyStoredProc 'param1', 'param2' 我得到了错误: 关键字“ exec”附近的语法不正确。 回答1 您可以拆分查询吗? 将存储的proc结果插入表变量或临时表中。 然后,从表变量中选择2列。 Declare @tablevar table(col1 col1Type,.. insert into @tablevar(col1,..) exec MyStoredProc 'param1',
  • 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
    表值参数Table-Value Parameter (TVP) 提供一种将客户端应用程序中的多行数据封送到 SQL Server 的简单方式,而不需要多次往返或特殊服务器端逻辑来处理数据。可以使用表值参数来包装客户端应用程序中的数据行,并使用单个参数化命令将数据发送到服务器。 传入的数据行存储在一个表变量中,然后您可以通过使用 Transact-SQL 对该表变量进行操作。 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。 本系列主要是针对T-SQL的总结。【T-SQL基础】01.单表查询-几道sql查询题【T-SQL基础】02.联接查询【T-SQL基础】03.子查询【T-SQL基础】04.表表达式-上篇【T-SQL基础】04.表表达式-下篇【T-SQL基础】05.集合运算【T-SQL基础】06.透视、逆透视、分组集【T-SQL基础】07.数据修改【T-SQL基础】08.事务和并发【T-SQL基础】09.可编程对象 ----------------------------------------------------------【T-SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子 ----------------------------------------------------------【T
  • 如何安排作业每天运行SQL查询?(How can I schedule a job to run a SQL query daily?)
    问题 我需要知道如何使用SQL Server代理作业以最少的必需配置设置使SQL查询每天运行。 回答1 展开“ SQL Server代理”节点,然后右键单击SQL Server代理中的'New Job'节点,然后选择'New Job' 在'New Job'窗口中,在'General'选项卡上输入作业的名称和说明。 选择窗口左侧的'Steps' ,然后点击底部的'New' 。 在'Steps'窗口中,输入步骤名称,然后选择要对其运行查询的数据库。 将要运行的T-SQL命令粘贴到“命令”窗口中,然后单击'OK' 。 单击'Schedule'新作业”窗口左侧的'Schedule'菜单,然后输入计划信息(例如每天和一个时间)。 单击'OK' -就是这样。 (当然,您还可以添加其他选项-但我要说的是,这是您设置和安排工作所需的最低要求) 回答2 我对接受的答案中的步骤进行了GIF动画处理。 这是从MSSQL Server 2012 回答3 要在t-sql中执行此操作,可以使用以下系统存储过程来安排日常作业。 本示例每天计划在1:00 AM。 有关各个存储过程的语法和有效参数范围的详细信息,请参见Microsoft帮助。 DECLARE @job_name NVARCHAR(128), @description NVARCHAR(512), @owner_login_name NVARCHAR
  • 如何在联接两个视图的SQL Server 2005存储过程中使用PIVOT(How to use PIVOT in SQL Server 2005 Stored Procedure Joining Two Views)
    问题 早上好, 我有2个视图:ICCUDays每个帐户包含一个记录,具有ACCOUNT和ICCUDays字段; ICCUEnctrSelectedRevCatsDirCost,每个帐户包含多个记录,具有ACCOUNT,UBCATEGORY和DirectCost字段。 我的目标:创建一个存储过程,用UBCATEGORY通过ICCUDays和DirectCost为每个ACCOUNT输出一个记录。 这将是一个交叉表或枢轴,并且必须考虑在一个或多个直接成本ubcategory存储桶中可能存在null的可能性。 最后,此交叉表或数据透视表需要发送到新表EnctrUBCatPivot。 问题:以上情况下正确的PIVOT语法是什么? 鉴于我想为许多UBCATEGORY条目输入直接成本,我该如何编写TSQL来对这些条目进行迭代并通过帐户和UBCATEGORY进行透视? 所有这些都是在一个存储过程中完成的,还是必须将其分成多个存储过程才能将结果写到表中? 这是我到目前为止编写的代码: ALTER PROCEDURE [dbo].[spICCUMain] -- Add the parameters for the stored procedure here AS declare @columns varchar(8000) BEGIN -- SET NOCOUNT ON added to