sql查找ID,如果没有找到结果则插入

时间:2013-03-18 11:25:49

标签: sql sql-server stored-procedures sql-server-2008-r2 user-defined-functions

我有一个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这样的东西,但我不知道如何去做。

3 个答案:

答案 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'')