我需要有效地从Ado.Net向SQl Server 2008提交成千上万的数字和日期.在SQL 2008之前的日子里,我将这些数字打包在图像中,这非常快.Erland Sommarskog非常友好地将我的一些代码包含在SQL Server 2005的文章Arrays and Lists中
因为现在我们可以使用TVP,我尝试了它们.在客户端,我运行这个:
dataTable = new DataTable();
dataTable.Columns.Add("Date", typeof(DateTime));
dataTable.Columns.Add("Price", typeof(decimal));
dataTable.Rows.Add(new object[] { someDate, somePrice });
command.CommandText = "Writers.SavePrices";
command.CommandType = CommandType.StoredProcedure;
var param = command.Parameters.AddWithValue("@Prices", dataTable);
param.SqlDbType = SqlDbType.Structured;
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但我认为它没有效率.我启动了Profiler,我立即看到Ado.Net发出以下效率极低的SQL被发送到服务器:
DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices
Run Code Online (Sandbox Code Playgroud)
结果,在发送,解析和编译时浪费了服务器上的大量网络带宽和CPU.有没有更有效的方法来使用Ado.Net的TVP?
我想调用存储过程,它返回表值函数中的表.如何创建表值函数?
例如:"sp_GetTable"是存储过程.它返回一个表.在这里,我想写一个名为"fn_GetTable"的函数
我希望得到存储过程给出的相同结果.
这是我的存储过程:
ALTER PROC sp_GetTable
AS
BEGIN
------------ Creating TempTable(#MasterTable) ----------------------
CREATE TABLE #MasterTable
(ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50),
D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50))
------------ Creating TempTable(#TempItems) ----------------------
CREATE TABLE #TempItems(ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50),
D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50))
------------ Creating & Inserting TempTable(@Dim) ----------------------
DECLARE @Dim TABLE (DCodes VARCHAR(100))
INSERT INTO @Dim SELECT D1_Code FROM MAS_SizeType WHERE D1_Code <> '' …Run Code Online (Sandbox Code Playgroud) sql sql-server stored-procedures sql-server-2005 user-defined-functions
有没有办法以编程方式执行(启动)SQL Server维护计划?我们有一个夜间运行的Windows服务,并使用大量数据更新数据库,一旦完成,我们希望在数据库中触发维护计划以开始运行.
从SQL Server 2000迁移旧数据库,并且有一些使用SP_OACreate&CDOSYS发送电子邮件到开放SMTP中继的计划任务,如此知识库文章中所述:http://support.microsoft.com/kb/312839
在SQL Server 2008 R2中,替换sendmail功能的最佳(最简单)方法是什么?似乎DB Mail是新推荐的最佳方式,任何人都有这方面的经验或其他选择吗?
与此相关的问题.有关如何内C#写长长的SQL查询,该解决方案建议,长的SQL查询应该写成:
string query = @"
SELECT
c.CUSTOMER_ID,
COALESCE (c.FIRST_NAME, ''_ + ' ' + COALESCE (c.LAST_NAME, '') AS FULL_NAME
ct.NAME as CUSTOMER_TYPE
FROM
CT_CUSTOMER_TYPE AS ct INNER JOIN CUSTOMER AS c
ON ct.CUSTOMER_TYPE_ID = c.CUSTOMER_TYPE_ID
";
Run Code Online (Sandbox Code Playgroud)
这让我对另一个相关问题感到好奇.我能以某种方式使用替代吗?也就是说,如果说表名更改但查询保持不变,我将如何管理?我是否必须回归使用另一种使用字符串连接构建字符串的方法,还是有更优雅的方法?
一般来说,我知道如何导入制表符分隔文件或逗号分隔文件.我的一位客户发给我分隔文件.您可以在下面看到示例.而且我不知道如何在没有引号的情况下导入它.
"Make","Model","ModelYear","Trim","BodyStyle","Mileage","EngineDescription","Cylinders","FuelType","Transmission"
"Dodge","Stealth","1993","ES","Hatchback","107000","V-6","6-Cylinder","Gasoline",""
"GMC","Envoy XL","2003","SLE","Sport Utility","116000","6cyl","6-Cylinder","Gasoline","Automatic"
Run Code Online (Sandbox Code Playgroud)
您能指导我如何导入以及我需要更改哪些设置才能使用导入向导导入它?
谢谢
我有一张看起来像的桌子
ID Layout
1 hello,world,welcome,to,tsql
2 welcome,to,stackoverflow
Run Code Online (Sandbox Code Playgroud)
期望的输出应该是
Id Splitdata
1 hello
1 world
1 welcome
1 to
1 tsql
2 welcome
2 to
2 stackoverflow
Run Code Online (Sandbox Code Playgroud)
我已通过以下查询完成此操作
Declare @t TABLE(
ID INT IDENTITY PRIMARY KEY,
Layout VARCHAR(MAX)
)
INSERT INTO @t(Layout)
SELECT 'hello,world,welcome,to,tsql' union all
SELECT 'welcome,to,stackoverflow'
--SELECT * FROM @t
;With cte AS(
select F1.id
,O.splitdata
from
(
select *,
cast('<X>'+replace(F.Layout,',','</X><X>')+'</X>' as XML) as xmlfilter
from @t F
)F1
cross apply
(
select fdata.D.value('.','varchar(MAX)') as splitdata
from f1.xmlfilter.nodes('X') as …Run Code Online (Sandbox Code Playgroud) sql t-sql sql-server sql-server-2005 common-table-expression
也许我在这里是个白痴,但我正在尝试将默认的DateTime值分配给MS SQL Server 2005中的存储过程,但无法让它工作,例如:
CREATE PROCEDURE MyProcedure
(
@MyInteger INT = 123,
@MyDateTime DATETIME = CONVERT(DATETIME, '1753-01-01 00:00:00', 20)
)
AS
BEGIN ... (snip)
Run Code Online (Sandbox Code Playgroud)
因此,如果@MyDateTime未指定输入参数,则默认情况下应使用"1753-01-01 00:00:00",但是我收到错误...
Incorrect syntax near the keyword 'CONVERT'.
Run Code Online (Sandbox Code Playgroud)
我可以让它为Integers工作就好了.我究竟做错了什么?
编辑:从下面的答案中,我最终在Sproc本身内部进行了以下操作:
CREATE PROCEDURE MyProcedure
(
@MyInteger INT = 123,
@MyDateTime DATETIME = NULL
)
AS
BEGIN
SET NOCOUNT ON
SET @MyDateTime = COALESCE(@MyDateTime, CONVERT(DATETIME, '1753-01-01 00:00:00', 20))
...snip...
END
Run Code Online (Sandbox Code Playgroud) 我遇到了在SQL Server中修改XML的问题,这对我来说似乎没有意义.我想更新一个空节点的值,但它似乎没有工作.例如,假设我有这个XML树:
<root>
<node />
</root>
Run Code Online (Sandbox Code Playgroud)
我想<node />用'foo' 更新值,所以我有XML查询:
UPDATE [Table]
SET [XmlColumn].modify('
replace value of (root/node/text())[1]
with "foo"')
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这不起作用.它将节点视为不存在.如果节点已经有一个值(例如<node>bar</node>),它可以正常工作,但是当节点为空时,它会默默地忽略该命令,甚至不会抛出任何错误.有没有办法让SQL Server replace value of在空节点上确认?
编辑:
我希望这个查询的最终结果是这样的:
<root>
<node>
foo
</node>
</root>
Run Code Online (Sandbox Code Playgroud) 使用Sql 2008时,更改跟踪是否有办法手动清理跟踪表?
我知道CHANGE_RETENTION和AUTO_CLEANUP属性,但会更好地控制清理.
sql-server ×10
sql ×4
t-sql ×2
ado.net ×1
bulkinsert ×1
c# ×1
sendmail ×1
service ×1
sqlbulkcopy ×1
xml ×1