如何根据机器名过滤获取 SQL 数据值?

Posted

技术标签:

【中文标题】如何根据机器名过滤获取 SQL 数据值?【英文标题】:How can I get SQL data values according to machine name filtering? 【发布时间】:2021-05-03 07:47:23 【问题描述】:

当我试图获取机器地址的特定数据值时,我无法获取此值

ALTER PROCEDURE [dbo].[Datade]
    @makineadı varchar,
    @startdate datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM HMI.[dbo].Tarihmakine 
    WHERE MakineAdı = @makineadı 
      AND Tarih = @startdate
END

我在这个 API 控制器中使用了这个存储过程,通常当我试图获取所需的 SQL 数据日期时,我可以提取它,但是当我尝试对机器名的字符串格式进行字符串处理时,我认为我无法获取此数据这是由双引号引起的,但我无法将其转换为单引号 ''

public class RaporController : ApiController

    public IHttpActionResult Getemprecords(string makineadı, DateTime? startdate)
    
        HMIEntities1 sd = new HMIEntities1();
        var results = sd.Data(makineadı, startdate).ToList();
        return Ok(results);
    

我使用此网页获取特定值 https://localhost:44355/api/rapor?makineadı=192.168.0.8&&startdate=2021-01-29

这是我的数据库enter image description here

【问题讨论】:

用您正在使用的数据库标记您的问题。 sd.Data 是做什么的?这是执行存储过程并处理结果的方法。如果编写得当,即如果它使用参数化查询,则根本不需要转换或引用 我认为这只是字符串(varchar)格式问题引起的,因为当我尝试根据 DateTime 值获取数据时不会出错。 sd.Data 是我在第一个查询中添加到下面的存储过程的数据表示名称 我添加我的数据库图片只是为了尝试获取值。我再次说我只有机器名称(MakineAdı)的问题。 Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar 变量和参数提供一个长度。否则,您的参数将具有 1 个字符的默认长度! 【参考方案1】:

您的代码看起来像 SQL Server。如果是这样,永远不要使用没有长度的字符串声明:

ALTER PROCEDURE [dbo].[Datade] (
    @makineadı varchar(255),
    @startdate datetime
) AS
BEGIN
    SET NOCOUNT ON;

    select *
    from HMI.[dbo].Tarihmakine
    where MakineAdı = @makineadı and Tarih = @startdate
END;

默认日期也因上下文而异——这些错误可能很难调试。在您的情况下,默认值为 varchar(1),这不是您想要的。

另一个潜在问题是使用datetime 作为第二个参数。但是,你想要什么并不清楚:

如果你。 Tarihdate,然后将参数作为 date 传递。 如果Tarihdatetime 并且您希望值在同一日期,则传入date 并使用convert(date, Tarih) = @startdate。 仅当Tarihdatetime(某种形式)并且您希望将比较时间缩短到几分之一秒时才按原样使用代码。

【讨论】:

我对日期查询没有问题,同样当我尝试仅根据机器名称进行查询时,例如在数据库中找不到的机器名称是 makineadı,我的机器名称数据是 Makine-1找到localhost:44355/api/rapor?makineadı=Makine-1,它无法向我显示 Makine-1 数据作为 API 形成这有形成 public class RaporController : ApiController public IHttpActionResult Getemprecords(string makineadı) HMIEntities1 sd = new HMIEntities1();var results = sd.Data (makineadı).ToList();返回确定(结果); 我认为这只是字符串(varchar)格式问题引起的,因为我在尝试根据 DateTime 值获取数据时不会出错 您可以设置某种 db/sql 小提琴。我怀疑问题只是机器名称不匹配。

以上是关于如何根据机器名过滤获取 SQL 数据值?的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何获取调用者的IP,机器名等信息,以及他们操作的SQL

SQL中如何根据字段名查找该字段名存在于数据库的哪些表中?

如何根据表 sql 中的列获取共同值

如何根据 Where 条件获取 Redshift 中的上述值?

sql中如何使一列中的多个重复数据只显示一次, 求大神指导,使得图中的班简名重复的只显示一次。

OBIEE:如何在保存的过滤器中设置“提示”值