我有一个非常复杂的CTE,我想将结果插入物理表.
以下是否有效?
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos
(
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
WITH tab (
-- some query
)
SELECT * FROM tab
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用一个函数来创建这个CTE,这将允许我重用.有什么想法吗?
我有一个非常基本的LEFT OUTER JOIN来返回左表中的所有结果以及来自更大表的一些附加信息.左表包含4935条记录,但当我将其连接到另一个表时,记录计数明显更大.
据我所知,LEFT OUTER JOIN将返回左表中的所有记录,右表中的匹配记录和任何无法匹配的行的空值,这是绝对的福音,因此我的理解是它应该不可能返回比左表中存在的行更多的行,但它发生的一切都是一样的!
SQL查询如下:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Run Code Online (Sandbox Code Playgroud)
也许我在语法上犯了一个错误,或者我对LEFT OUTER JOIN的理解是不完整的,希望有人可以解释这是如何发生的?
后记
感谢你们给出了很好的答案,我对LEFT OUTER JOINS的理解现在要好得多,但是有人可以提出一种方法可以修改这个查询,这样我只能获得与左表中存在的记录一样多的记录吗?
此查询纯粹是为了生成报告,而重复的匹配只是简单地混淆了问题.
/后记
我有这个脚本:
CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 )
RETURNS BIT
AS
BEGIN
IF EXISTS ( bla bla bla )
RETURN 1;
RETURN 0;
END
GO
Run Code Online (Sandbox Code Playgroud)
我想以这种方式在一个过程中使用它:
IF dbo.CheckIfSFExists( 23 ) = 0
SET @retValue = 'bla bla bla';
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
为程序或函数dbo.CheckIfSFExists提供的参数数量不足.
为什么不起作用?
我正在尝试调试其他人的SQL报告,并将基础报告查询放入SQL 2012的查询窗口中.
报告要求的参数之一是整数列表.这是通过多选下拉框在报告上实现的.报告的基础查询在where子句中使用此整数列表,例如
select *
from TabA
where TabA.ID in (@listOfIDs)
Run Code Online (Sandbox Code Playgroud)
我不想修改我正在调试的查询,但我无法弄清楚如何在SQL Server上创建一个可以保存此类数据来测试它的变量.
例如
declare @listOfIDs int
set listOfIDs = 1,2,3,4
Run Code Online (Sandbox Code Playgroud)
没有可以保存整数列表的数据类型,那么如何在我的SQL Server上使用与报表相同的值运行报表查询?
是否有一种优雅的方法来处理将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)
Run Code Online (Sandbox Code Playgroud) 当在select语句中用作字段值时,是否可以将1或0表示为位?
例如
在这种情况下,语句(它是select语句的一部分)ICourseBased的类型为int.
case
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)
要使它成为一种类型,我必须转换两个值.
case
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方式将值表示为位类型,而不必每次都进行转换?
(我正在使用MS SQL Server 2005)
在SQL中,如何删除表中特定列的值的前4个字符?列名是Student Code,示例值是ABCD123Stu1231.我想从我的表中删除前4个字符以获取所有记录
请指导我
我正在SQL Server 2008中编写一个用户定义的函数.我知道函数不能以通常的方式引发错误 - 如果您尝试包含RAISERROR语句SQL返回:
Msg 443, Level 16, State 14, Procedure ..., Line ...
Invalid use of a side-effecting operator 'RAISERROR' within a function.
Run Code Online (Sandbox Code Playgroud)
但事实是,该函数需要一些输入,这可能是无效的,如果是,则函数可以返回没有有意义的值.那我该怎么办?
当然,我可以返回NULL,但是使用该函数的任何开发人员都很难对此进行故障排除.我也可能导致除零或类似的东西 - 这会产生错误信息,但会产生误导性信息.有什么方法可以以某种方式报告我自己的错误消息吗?
我有两个表,其中列[date]是类型DATETIME2(0).
我必须比较他们日期部分(日+月+年)的两个记录,丢弃时间部分(小时+分钟+秒).
我怎样才能做到这一点?