sql查找ID并在没有找到结果时插入
Posted
技术标签:
【中文标题】sql查找ID并在没有找到结果时插入【英文标题】:sql lookup ID and insert if no result found 【发布时间】:2013-03-18 11:25:48 【问题描述】:我有一个 select 语句,需要从客户名称中查找客户 ID
。如果该名称不存在ID
,则需要在客户表中创建一条新记录。这必须作为 select 语句的一部分来完成(与运行它的应用程序相关)。
我尝试查看返回现有ID
或新ID
的UDF,然后才意识到您无法通过函数修改表。
知道如何做到这一点吗?
编辑:
我想我需要进一步澄清一些事情。 select 语句可以并且将在每个实现的基础上发生变化。我正在寻找的是一种通用的方式来查找或创建客户 ID(该表和进行查找的需要不会改变)作为更大的选择语句的一部分。
使用 sql 的应用程序从配置文件加载 select 语句,并有 'SELECT'
硬编码,所以没有机会在 select 等之前添加 exec。
看起来我需要的是 'select a.1 (exec dotheLookup(name)) as customerID, a.2 FROM table
之类的东西,但我不知道该怎么做。
【问题讨论】:
你用的是什么数据库? 哎呀。 SQL Express 2008 r2 使用存储过程代替函数。 你想在函数或存储过程中选择语句? 我想不出一种方法来对以SELECT
关键字开头的单个查询执行数据操作。
【参考方案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 语句执行数据操作。
【讨论】:
语句可以包含子查询等,它必须以'SELECT'开头【参考方案2】:您可以在执行 SELECT 语句之前执行一个存储过程,运行一个从名称返回 ID 的函数:
exec CheckForCustomerByNameAndAddIDIfItDoesntExist(customerName)
declare iCustomerID int
select iCustomerID = GetCustomerIDFromName(customerName)
select a.1, a.2, iCustomerID as customerID from table
类似的东西
【讨论】:
不幸的是我不能在选择语句之前运行任何东西。使用查询的应用程序从配置文件加载它并按原样执行它。它还具有“选择”硬编码。失败的设计是失败的,但它是我坚持的。【参考方案3】:你能修改数据库服务器吗?如果是这样,请添加指向本地服务器的链接服务器。
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'')
【讨论】:
有可能,我得检查一下!以上是关于sql查找ID并在没有找到结果时插入的主要内容,如果未能解决你的问题,请参考以下文章
需要使用正则表达式找到2个字符串,并在它们之间插入多行文本并插入替换文本