MS SQL有一个方便的解决方法,用于将多行的列值连接成一个值:
SELECT col1
FROM table1
WHERE col2 = 'x'
ORDER by col3
FOR XML path('')
Run Code Online (Sandbox Code Playgroud)
并返回一个很好的记录集:
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------
<col1>Foo</col1><col1>Bar</col1>
Run Code Online (Sandbox Code Playgroud)
只返回记录集中的列名是相当讨厌的!
列名似乎包含随机元素(或GUID),因此我不愿意在我的应用程序中使用它(不同的实例或不同的服务器可能有另一个GUID).不幸的是我无法使用*来选择值,并且由于现有应用程序中的限制,我无法迭代返回的列,或者......
有没有办法强制返回的记录集中的列名更合理?
海家伙,
我使用了以下分割功能,
CREATE FUNCTION dbo.Splitfn(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
Run Code Online (Sandbox Code Playgroud)
我在查询中使用了这个函数并执行了它
ALTER PROCEDURE [dbo].[Employees_Delete]
-- Add the parameters …Run Code Online (Sandbox Code Playgroud) 在SQL中,我有col1和col2.两者都是整数.
我想这样做:
select col1/col2 from tbl1
Run Code Online (Sandbox Code Playgroud)
我得到的结果1是col1=3和col2=2
我想要的结果是 1.1
我说round(col1/col2,2).结果仍然是1.
我说decimal(col1/col2,2).小数不是在函数中构建的.
我怎么能完全得到1.1?
我在同一个数据库服务器上的不同数据库中有两个表.
两个数据库都具有相同的结构,但数据不同.Database1(Test1)是最新的,而database2(Test2)是数据库的旧副本.
Employee3000记录的表Employee1000记录的表我需要从Test2中的同一个表更新Test1中的表,以获取名为DeptID的特定列,因为Test2 DB(旧的)中Employee表中的值已更新.所以我需要从旧DB中的表中更新新DB中的表,该表具有大约1000行.
换句话说,我需要更新DeptID列Employee表中Test1有我在任何值DB DeptID列Employee在表Test2DB.
我知道我可以恢复数据库本身,但这不是解决方案.我需要从Test2数据库更新Test1数据库中的值.
我知道这已被要求死亡,我知道为什么SQL Server不允许你这样做.
但除了使用扩展存储过程之外,还有其他解决方法吗?
请不要告诉我将我的功能转换为程序...
所以我真正要问的是:有没有办法从函数中运行存储过程?
编辑:
有点证明:有一种解决方法,但它是如此错误,我不会这样做.我要将其更改为存储过程并在其他地方执行.
sql sql-server stored-procedures sql-server-2005 user-defined-functions
以下是代码示例:
CREATE TABLE #titles(
title_id varchar(20),
title varchar(80) NOT NULL,
type char(12) NOT NULL,
pub_id char(4) NULL,
price money NULL,
advance money NULL,
royalty int NULL,
ytd_sales int NULL,
notes varchar(200) NULL,
pubdate datetime NOT NULL
)
GO
insert #titles values ('1', 'Secrets', 'popular_comp', '1389', $20.00, $8000.00, 10, 4095,'Note 1','06/12/94')
insert #titles values ('2', 'The', 'business', '1389', $19.99, $5000.00, 10, 4095,'Note 2','06/12/91')
insert #titles values ('3', 'Emotional', 'psychology', '0736', $7.99, $4000.00, 10, 3336,'Note 3','06/12/91')
insert #titles values ('4', 'Prolonged', 'psychology', …Run Code Online (Sandbox Code Playgroud) 我在我的网站上提供搜索功能,当用户搜索记录然后我想显示查询所用的时间以获得与谷歌相同的结果.当我们搜索任何内容时,谷歌会显示获得结果所需的时间吗?
为此我在我的SP中声明了一个@start变量,并在最后找到差异,如下所示;
DECLARE @start_time DATETIME
SET @start_time = GETDATE()
-- my query
SELECT * FROM @search_temp_table
SELECT RTRIM(CAST(DATEDIFF(MS, @start_time, GETDATE()) AS CHAR(10))) AS 'TimeTaken'
Run Code Online (Sandbox Code Playgroud)
有没有其他简单快捷的方法,或者单行查询,我们可以通过它查找执行查询的时间?
我正在使用SQL Server 2005.
这是我在这里问到的一个后续问题.
DB中的约束可以具有相同的名称吗?
说我有:
CREATE TABLE Employer
(
EmployerCode VARCHAR(20) PRIMARY KEY,
Address VARCHAR(100) NULL
)
CREATE TABLE Employee
(
EmployeeID INT PRIMARY KEY,
EmployerCode VARCHAR(20) NOT NULL,
CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer
)
CREATE TABLE BankAccount
(
BankAccountID INT PRIMARY KEY,
EmployerCode VARCHAR(20) NOT NULL,
Amount MONEY NOT NULL,
CONSTRAINT employer_code_fk FOREIGN KEY (EmployerCode) REFERENCES Employer
)
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?它取决于DBMS(我在SQL Server 2005上)吗?如果不允许,是否有人对如何解决它有任何建议?
我在运行以下Transact-SQL命令时遇到错误:
CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)
Run Code Online (Sandbox Code Playgroud)
错误是:
消息1505,级别16,状态1,行1 CREATE UNIQUE INDEX语句终止,因为找到了对象名称'dbo.DimMeasureTopic'和索引名称'IX_TopicShortName'的重复键.重复键值为().
当我运行SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'或SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')IX_TopicShortName索引不显示时.所以似乎没有重复.
我在另一个数据库中有相同的模式,可以在那里创建没有问题的索引.任何想法为什么它不会在这里创造?
我想从中获取值Exec(@sql)并分配给@Rowcount(int)
这是我的查询:
'SET @RowCount = (select count(*)
FROM dbo.Comm_Services
WHERE CompanyId = '+cast(@CompanyId as char)+' and '+@condition+')'
Run Code Online (Sandbox Code Playgroud) sql-server-2005 ×10
sql-server ×7
sql ×6
t-sql ×4
constraints ×1
indexing ×1
unique-index ×1
xml ×1