SQL Server中是否有一个函数来规范化unicode字符串?例如
UPDATE Orders SET Notes = NormalizeString(Notes, 'FormC')
Run Code Online (Sandbox Code Playgroud)
Unicode规范化表单:
A+ ¨变ÄÄ变为A+¨A+ ¨+ ?+ n变为Ä+ f+ i+nÄ+ ?+ n变为A+ ¨+ f+ i+n我找不到任何内置函数,所以我假设没有.
理想情况下,如果只有一个,那么我今天碰巧需要表格C:
Unicode规范化形式C,规范组合.将每个分解的分组(由基本字符加组合字符组成)转换为规范的预组合等效项.例如,A +¨变为Ä.
sql-server globalization unicode internationalization sql-server-2008-r2
我们的团队目前正在集思广益一个产品理念,这个理念在我们的方言中已经存在了几年了.
它很可能是托管在WISC堆栈上的ASP.NET MVC Web应用程序(Windows,IIS,SQL Server,C#)......
理想情况下,我们喜欢跟随类似路线前往雾溪的家伙们使用fogbugz提供托管和"运行服务器"风格的解决方案.
当然,我们希望保持代码和数据库模式几乎完全相同(出于维护目的),因此我们可以一次编译.
因此,拥有"为所有用户提供一个大数据库"似乎会增加开发人员开销,从而保持架构等方面的差异.
我记得在2008年收听了堆栈溢出播客,其中joel spolskey提到他的SQL Server实例有数千个数据库,因为它们为每个用户提供了一个专用数据库,但是SQL Server 2000管理那么多数据库时出现了扩展问题.
所以我的问题是:
如何使用当前时间选择过去12个月的名称.没有使用任何表,如果当前月份是10月,那么我希望结果为
month year
oct 2011
nov 2011
dec 2011
jan 2012
feb 2012
mar 2012
apr 2012
may 2012
jun 2012
jul 2012
aug 2012
sep 2012
oct 2012
Run Code Online (Sandbox Code Playgroud)
我没有数据库中的任何表格.
我在设计一个需要在未来进行水平分区的多租户数据库模式时,试图找出最佳方法.
数据库上的一些粗糙数字..
租户总数约为10,000.每个租户存储的数据量在500MB - > 3GB之间变化.租户的数量将从小开始,并在几年内增长到10,000,所以最初我们可以从单个多租户数据库开始,但从长远来看,由于性能原因需要横向扩展.
更新 - 一个复杂的因素是偶尔租户(公司)可以合并在一起,我也需要支持这个...,
多租户将使用共享数据库,共享架构架构实现,如本文所述http://msdn.microsoft.com/en-us/library/aa479086.aspx
鉴于我们将来会面临水平分区,并且很可能我们会在客户安定下来之前将客户端从一个数据库移动到另一个数据库,我认为最好将GUID用作每个表的主键以及唯一的tenantID列.
我知道使用GUID作为主键存在性能开销,但这是我需要接受的权衡吗?还有另一种设计水平分区的方法吗?
下面是一个例子 - 假设我想将公司与租户100和200合并在一起,如果PK是一个整数,当我将数据库2中的行复制到数据库1时可能会发生冲突,{guids}我保证不会发生碰撞......
数据库1数据库2 tenantid,id,description tenantid,id,description 100,1,'foo'200,1,'xxx'100,2,'boo'200,2,'yyy'
数据库1数据库2 tenantid,id,description tenantid,id,description 100,{aaa},'foo'200,{ccc},'xxx'100,{bbb},'boo'200,{ddd},'yyy'
我不太明白为什么这两个不同的代码示例会返回不同的值.
以某种方式不正确但工作语法,返回错误结果,例如,0当比较在两个相等的值上完成时返回:
(SELECT CASE
WHEN
SUM(V.IsCompatible) OVER
(PARTITION BY ComputerName, UserID) = ApplicationCount
THEN 1 ELSE 0 END
) AS CompatibleUser
Run Code Online (Sandbox Code Playgroud)
下面的那个返回正确的值,即.1当比较两个相等的值时.
(CASE
WHEN
SUM(V.IsCompatible) OVER
(PARTITION BY ComputerName, UserID) = ApplicationCount
THEN 1 ELSE 0 END
) AS CompatibleUser
Run Code Online (Sandbox Code Playgroud)
甚至更简单:
(SELECT CASE
WHEN
X = Y
THEN 1 ELSE 0 END
) AS Result
Run Code Online (Sandbox Code Playgroud)
X = 22且Y = 22 =>结果= 0
(CASE
WHEN
X = Y
THEN 1 ELSE …Run Code Online (Sandbox Code Playgroud) 我们正在将SQL 2000框迁移到SQL 2008.但是我们遇到了一个问题.当使用具有UNION的查询返回结果集(行或不)时.稍后在代码中我们尝试添加一个新行并为其分配字段,但由于使用了UNION,当我们尝试为字段赋值时,它会给我们一个Multiple-step operation generated errors. Check each status value.错误.我们在Windows XP和Windows 7上尝试了以下代码并得到了相同的结果.但是当我们更改连接字符串以指向我们的SQL 2000框时,我们不再会遇到该错误.
以下示例显示了我们遇到的问题.
var c = new ADODB.Connection();
var cmd = new ADODB.Command();
var rs = new ADODB.Recordset();
object recordsAffected;
c.Open("Provider=SQLOLEDB;Server=*****;Database=*****;User Id=*****;Password=*****;");
cmd.ActiveConnection = c;
cmd.CommandType = ADODB.CommandTypeEnum.adCmdText;
cmd.CommandText = "create table testing2008 (id int)";
cmd.Execute(out recordsAffected);
try {
cmd.CommandText = "select * from testing2008 union select * from testing2008";
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
rs.Open(cmd, Type.Missing, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockBatchOptimistic, -1);
rs.AddNew();
rs.Fields["id"].Value = 0; //throws exception
rs.Save();
}
catch …Run Code Online (Sandbox Code Playgroud) 这是一个更复杂的后续问题:查找顺序值的有效方法
每个产品可以有许多Segment行(数千).每个段的位置列从每个产品(1,2,3,4,5等)开始为1,值列可以包含任何值,如(323.113,5423.231,873.42,422.64,763.1等). ).数据是只读的.
将产品视为歌曲并将片段视为歌曲中的一组音符可能会有所帮助.
给定一个连续片段的子集,如歌曲的片段,我想确定产品的潜在匹配.但是,由于测量潜在的错误,子集中的片段可能不匹配数据库中的部分正好.
如何通过查找与我测量的细分子集最匹配的产品细分来识别候选产品?此外,数据库是此类数据的最佳媒介吗?
以下是关于我如何解决这个问题的一些想法.请不要将这些作为确切要求.我对任何类型的算法都持开放态度,以使这项工作尽可能最好.我认为需要有多个阈值变量来确定贴近度.一种可能性是实现接近阈值和匹配阈值.
例如,给定以下值:
Product A contains these segments: 11,21,13,13,15.
Measurement 1 has captured: 20,14,14,15.
Measurement 2 has captured: 11,21,78,13.
Measurement 3 has captured: 15,13,21,13,11.
Run Code Online (Sandbox Code Playgroud)
如果接近度阈值所允许的测量段为1以上或实际段的下方,然后测量1可能因为尽管许多段不匹配匹配产品A 完全相同,它们相对于实际值的接近度阈值内.
如果匹配阈值允许匹配为3或更多的测量,则测量2可以返回产品A,因为尽管其中一个段(78)远远超过接近阈值,但它仍然以正确的顺序匹配3个段,因此在匹配门槛.
测量3与产品A不匹配,因为尽管所有测量的段都存在于实际段中,但它们不在接近或匹配阈值内.
更新:其中一个答案要求我定义最接近匹配的意思.我不确定如何回答这个问题,但我会试着通过继续这首歌的比喻来解释.假设片段代表录制歌曲的最大频率.如果我再次录制同一首歌,它会有相似之处,但是由于背景噪音和录音设备的其他限制,有些频率会匹配,有些会很接近,有些会很接近.在这种情况下,您如何定义一个录音与另一个录音"匹配"的时间?这是我正在寻找在这个问题中使用的相同类型的匹配逻辑.
我可以像在.dbml中一样在我的.edmx文件中添加SQL函数吗?如果可以的话,怎么做?如果我不能,是否有任何解决方法?
我试图谷歌,但没有找到任何具体的答案,如何做到这一点.
基于给定的答案,我创建了一个存储过程,并尝试添加"导入函数",但它表示"存储过程不返回任何列".我哪里做错了?功能:
ALTER FUNCTION [dbo].[fn_locationSearch](@keyword varchar(10))
RETURNS TABLE
AS
RETURN
(
SELECT CustomerBranch.ID,CustomerBranch.BranchName,CustomerBranch.Longitude,CustomerBranch.Latitue,CustomerBranch.Telephone,CustomerBranch.CategoryID,CustomerBranch.Description
FROM FREETEXTTABLE (CustomerOffer,*,@keyword) abc INNER JOIN OffersInBranch
ON abc.[key]=OffersInBranch.OfferID INNER JOIN CustomerBranch ON OffersInBranch.BranchID=CustomerBranch.ID
UNION
SELECT CustomerBranch.ID,CustomerBranch.BranchName,CustomerBranch.Longitude,CustomerBranch.Latitude,CustomerBranch.Telephone,CustomerBranch.CategoryID,CustomerBranch.Description
FROM CustomerBranch WHERE FREETEXT(*,@keyword)
)
Run Code Online (Sandbox Code Playgroud)
存储过程:
ALTER PROCEDURE USP_locationSearch
(@keyword varchar(10))
AS
BEGIN
SELECT * from dbo.fn_locationSearch(@keyword)
END
Run Code Online (Sandbox Code Playgroud) 我正试图在列表中使用a 中的put CASE语句,并找到一些我不理解的奇怪行为.这是一些代码:ORDER BYDISTINCTSELECT
select distinct Requester, ISO_ID as ISO, (ISO_ID - 5 + 50) AS 'someNum', BU
from LoanerHeader order by
CASE WHEN 'a' = 'b' then Requester
when 'b' = 'c' then BU
else ISO_ID
end
Run Code Online (Sandbox Code Playgroud)
这有效.但是,如果我将第4行更改为when 'b' = 'b' then BU:
select distinct Requester, ISO_ID as ISO, (ISO_ID - 5 + 50) AS 'someNum', BU
from LoanerHeader order by
CASE WHEN 'a' = 'b' then Requester
when 'b' = 'b' then …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个SQL Server中的多租户工具.我正在考虑这里描述的共享数据库,共享架构和租户视图过滤器.唯一的缺点是碎片连接池......
根据http://msdn.microsoft.com/en-au/architecture/aa479086,租户视图过滤器描述如下:
"SQL视图可用于授予单个租户访问给定表中某些行的权限,同时防止他们访问其他行.
在SQL中,视图是由SELECT查询的结果定义的虚拟表.然后可以查询生成的视图并将其用于存储过程,就好像它是一个实际的数据库表一样.例如,以下SQL语句创建一个名为Employees的表的视图,该表已被过滤,以便只显示属于单个租户的行:
CREATE VIEW TenantEmployees AS
SELECT * FROM Employees WHERE TenantID = SUSER_SID()
Run Code Online (Sandbox Code Playgroud)
此语句获取访问数据库的用户帐户的安全标识符(SID)(您可以回忆,它是属于租户的帐户,而不是最终用户),并使用它来确定视图中应包含哪些行"
考虑到这一点,如果我们有一个数据库存储5,000个不同的租户,那么连接池就完全碎片化,每次向数据库发送请求时,ADO.NET都需要建立一个新的连接并进行身份验证(请记住连接池适用于每个唯一连接字符串)这种方法意味着你有5,000个连接字符串......
我有多担心这件事?有人能给我一些真实世界的例子,说明连接池对繁忙的多租户数据库服务器有多大影响(比如每秒处理100个请求)?我可以在这个问题上投入更多硬件吗?它会消失吗?
思绪??
sql-server ×10
sql ×3
asp.net ×2
multi-tenant ×2
t-sql ×2
ado ×1
algorithm ×1
fuzzy-search ×1
guid ×1
iis ×1
linq ×1
partitioning ×1
performance ×1
unicode ×1