有一个复杂的SELECT查询,我想从中将所有行插入表变量,但是T-SQL不允许它.
同样,您不能将表变量与SELECT INTO或INSERT EXEC查询一起使用. http://odetocode.com/Articles/365.aspx
简短的例子:
declare @userData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
SELECT name, location
INTO @userData
FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30
Run Code Online (Sandbox Code Playgroud)
表变量中的数据稍后将用于将其插入/更新回不同的表(大多数是具有次要更新的相同数据的副本).这样做的目的是简单地使脚本比SELECT INTO直接进入正确的表更易读,更容易定制.性能不是问题,因为rowcount它相当小,只在需要时手动运行.
......或者告诉我,如果我做错了.
给定以下数据集与日期表配对:
MembershipId | ValidFromDate | ValidToDate
==========================================
0001 | 1997-01-01 | 2006-05-09
0002 | 1997-01-01 | 2017-05-12
0003 | 2005-06-02 | 2009-02-07
Run Code Online (Sandbox Code Playgroud)
Memberships在任何一天或几天的时间里有多少人开放?
下面这个问题被问在这里,这个答案提供了必要的功能:
select d.[Date]
,count(m.MembershipID) as MembershipCount
from DIM.[Date] as d
left join Memberships as m
on(d.[Date] between m.ValidFromDateKey and m.ValidToDateKey)
where d.CalendarYear = 2016
group by d.[Date]
order by d.[Date];
Run Code Online (Sandbox Code Playgroud)
虽然一位评论者评论说,当非等值的时间太长时,还有其他方法.
因此,equijoin只有逻辑看起来像复制上面查询的输出?
从目前为止提供的答案中我得出了以下内容,它在我使用的320万Membership条记录的硬件上表现优异:
declare @s date = '20160101';
declare @e date = getdate();
with s …Run Code Online (Sandbox Code Playgroud) 我需要能够使用tsql备份和恢复我的数据库.我正在使用的方法是:
-- backup
backup database testdb1 to disk='c:\testdb1.bak'
-- restore
alter database testdb1 set single_user with rollback immediate
drop database testdb1
restore database testdb1 from disk='c:\testdb1.bak'
Run Code Online (Sandbox Code Playgroud)
这工作正常,但需要在现有文件c:\testdb1.bak.只要我在本地安装了SQL服务器,这不是问题,但如果我远程连接到服务器该怎么办?任何摆脱这一要求的解决方案?
对我来说,这个文件的名称和路径是什么并不重要,我只需要确保如果我的alter脚本出错,我就能恢复数据库.
谢谢.
更新
问题是c:\某些版本的Windows禁止在根目录下创建文件.使用C:\1\很好.
我正在通过Biml创建一个SSIS项目(使用Vimgence BimlExpress页面的当前版本的BimlExpress ),该项目使用数据流任务中的脚本组件.创建项目时没有问题,但是当它到达脚本组件时会出现错误:
无法加载文件或程序集'Microsoft.SqlServer.DTSPipelineWrap,Version = 14.100.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91'或其依赖项之一.该系统找不到指定的文件.
在Script.Sain.PreExecute()at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()
我可以在GAC中看到这个dll,当我尝试手动添加引用时,SSIS声明我无法添加它,因为它已经包含在项目中.
但是,如果我打开脚本组件并手动操作Build- 但不做其他更改 - 数据流任务将毫无问题地运行.
为了澄清,我知道我没有改变任何其他因为我每次想要测试一种新方法时都会从Biml重新创建这个项目,这提供了一致的基线.
有谁知道为什么包含对GAC dll的引用的脚本组件只能在手动Built但不是事先工作?
虽然在不同的环境中,我之前使用过这个确切的Biml没有问题.使用Visual Studio 2012对抗SQL Server 2016实例但在Visual Studio 2015(针对2012)中不针对SQL Server 2016实例.
对于进一步的上下文,我还测试了这个输出针对SQL Server 2012,2014和2016的SSIS项目以及完全相同的错误消息.
这似乎肯定是项目中的dll版本问题,作为BimlExpress的输出,因为如果我v4.0_14.100.0.0__89845dcd8080cc91在C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SqlServer.DTSPipelineWrap脚本组件中手动创建带有版本13 dll 的文件夹,现在错误输出如下:
System.InvalidCastException:无法将类型为"System .__ ComObject"的COM对象强制转换为接口类型"Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100".此操作失败,因为由于以下错误,对IID'{ ID in removed in case }' 的接口的COM组件的QueryInterface调用失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)).
在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(例外e)
在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()
在Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100包装器)
任何帮助深表感谢.我正在尝试创建一个SSIS包来循环文件夹中的文件并获取Path +文件名,最后使用参数path + filename执行存储过程.我不知道如何获取路径+文件名并将其作为参数插入到存储过程中.我附上了截图供您参考.
创建记录时,我有一个smalldatetime名为myTime录制的字段.我需要选择在过去一小时内创建的记录的语法.
以为它会是:
and DATEDIFF("hh", datePart(hh, myTime), DatePart(hh, GETDATE()) < 1
Run Code Online (Sandbox Code Playgroud)
哪里 datediff
我得到的结果显然是方式,但我不知道为什么.
附录:由于这两个答案基本上都是一致的,因此这不会为我返回任何内容的事实必须追溯到我的表格是如何创建的.它是由LogParser针对IIS日志创建的,并且日期/时间信息分布在2个不同的字段中.Date只保存今日记录的日期信息:2010-06-08 00:00:00.000时间字段如下:( 2010-01-01 15:02:51.000所有记录的日期部分是01年1月1日).
在我的存储过程中,我有多个类似的变量@V1,@V2... @V20(假设其中20个)来自记录的FETCHED.我如何使用动态SQL使用这些变量作为参数对另一个存储过程进行20次调用?
当然@V[i]语法不正确,但它表达了意图
fetch next from maincursor into @status, @V1, @V2, ...
while @i<21
begin
-- ??? execute sp_executesql 'SecondSP', '@myParam int', @myParam=@V[i]
-- or
-- ??? execute SecondSP @V[i]
set @i = @i+1
end
Run Code Online (Sandbox Code Playgroud) 我必须处理的电话号码,如澳大利亚国家代码下面的代码+61,61,001161等我有我不能插入任何问题CASE了声明下:CASE WHEN LEFT(@BPartyNo, 4) = '+610'
它说Case表达式只能嵌套到10级
如何简化这个TSQL,以便我可以添加更多CASE?
USE [TelcoStage_PROD]
GO
/****** Object: UserDefinedFunction [dbo].[ufn_stg_ProperBPartyNoExtra] Script Date: 07/12/2010 15:27:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--=====================================================================================================================
-- OBJECT NAME : dbo.ufn_stg_ProperBPartyNoExtra
-- INPUTS : @BPartyNo
-- OUTPUTS : VARCHAR(32)
-- RETURN CODES : N/A
-- DEPENDENCIES : N/A
-- DESCRIPTION : This function is used to get the extra after 10 character (MNET or S)
--
-- …Run Code Online (Sandbox Code Playgroud) 当我尝试用单行打印一行时int,nvarchar我收到一个错误.这是我的全部代码.
DECLARE @COUNT INT, @CONST INT
SET @COUNT = 0
SET @CONST = 12
WHILE(@COUNT<12)
BEGIN
SET @COUNT = @COUNT + 1
PRINT @COUNT + N' times ' + @CONST + N' is ' + @COUNT*@CONST
END
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
消息245,级别16,状态1,行8转换将nvarchar值'times'转换为数据类型int时失败.
我可以自己打印'int' nvarchar,但是当我将它们组合起来时,我会收到这个错误.我是不正确地将它们组合在一起的?
我正在使用Microsoft SQL Management Studio
如何获取数据中的特定字节范围varbinary?
例如,varbinary数据长度为128,我只想获得15-19个字节.