我有一个select语句,需要从客户名称中查找客户ID
。如果该名称不存在ID
,则需要在customer表中创建新记录。这必须作为select语句的一部分完成(与从中运行的应用程序相关)。
我尝试查看返回现有ID
或新ID
的UDF,然后才意识到您无法修改函数中的表。
任何想法如何实现这一目标?
编辑:
我想我需要澄清一些事情。 select语句可以并且将在每个实现的基础上更改。我正在寻找的是查找或创建客户ID的通用方法(该表和查找的需要不会改变)作为更大的select语句的一部分。
使用sql的应用程序从配置文件加载select语句,并且'SELECT'
已经硬编码,因此在选择之前没有机会添加exec等。
看起来我需要的是像'select a.1 (exec dotheLookup(name)) as customerID, a.2 FROM table
这样的东西,但我不知道如何去做。
答案 0 :(得分:1)
我建议你为此创建一个存储过程。像
这样的东西Create procedure customer
--parameters
AS
Begin
IF exists(Select lookup(customerName) as customerID from table)
BEGIN
--Your select goes here
END
ELSE
BEGIN
--Insert into customer table and return scopeidentity
--Select goes here
END
END
更新的答案:
您无法使用select语句执行数据操作。
答案 1 :(得分:0)
您可以在执行SELECT语句之前执行存储过程,运行从名称返回ID的函数:
exec CheckForCustomerByNameAndAddIDIfItDoesntExist(customerName)
declare iCustomerID int
select iCustomerID = GetCustomerIDFromName(customerName)
select a.1, a.2, iCustomerID as customerID from table
像这样的东西
答案 2 :(得分:0)
您可以修改数据库服务器吗?如果是这样,请添加指向本地服务器的链接服务器。
EXEC master.dbo.sp_addlinkedserver @server = N'LinkedLocal', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'LocalServerName'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedLocal',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
然后运行一个OPENQUERY来调用执行您工作的存储过程:
select * from OPENQUERY("LinkedLocal", 'exec Database.Schema.StoredProcedure ''Param1'', ''Param2'')