sql-server - 如何在SQL Server 中自动将YES/NO 转换为BIT?

标签 sql-server database sql-function

我想覆盖 SQL Server 中系统定义的转换。这可能吗?

问题陈述

我有一个很大的 csv 文件来上传数据库中的数据。有一列 BIT 类型包含 True/False, Yes/No, 1/0

当我使用批量插入 True/False 时,'1/0' 将被视为正确值,但 Yes/No(如预期)将引发转换错误.

有没有什么方法可以在没有任何循环或一个值一个值的情况下转换是/否

编辑

自定义数据类型PanelMemberType

CREATE TYPE [dbo].[PanelMemberType] AS TABLE(
 [Email] [nvarchar](255) NOT NULL,
 [LocationName] [nvarchar](255) NOT NULL,
 [OptInPermission] [nvarchar](255) NOT NULL
)
GO

存储过程代码:

ALTER PROCEDURE [dbo].[PanelMemberBulkUpdate]
     @tblPanelMember PanelMemberType READONLY, 
     @PanelID int, 
     @UserID nvarchar(128)
AS
BEGIN
     SET NOCOUNT ON;

     MERGE INTO PanelMember p1
     USING @tblPanelMember p2 ON p1.Email= p2.Email

     WHEN MATCHED THEN
         UPDATE SET  
             p1.PanelID = @PanelID,
             p1.LocationID = (SELECT TOP(1) [LocationID] 
                              FROM [dbo].[Location] 
                              WHERE [LocationName] = p2.LocationName),
             p1.Email = p2.Email,
             p1.OptInPermission = CONVERT(BIT, p2.OptInPermission),
             p1.DateAdded = p1.DateAdded, 
             p1.DateLastUpdated = (SELECT GETDATE()),
             p1.LastUpdateUserID = @UserID

     WHEN NOT MATCHED THEN
          INSERT (PanelID, LocationID, Email, OptInPermission, DateAdded) 
          VALUES (@PanelID, (SELECT TOP(1) [LocationID] 
                             FROM [dbo].[Location] 
                             WHERE [LocationName] = p2.LocationName), 
                  p2.Email, CONVERT(BIT, p2.OptInPermission),
                  (SELECT GETDATE()));
END

最佳答案

只需多应用一点逻辑,而不是尝试盲目地转换为 bit:

p1.OptInPermission = convert( bit,
      CASE p2.OptInPermission
        WHEN 'Yes' THEN 1
        WHEN 'No' THEN 0
        ELSE p2.OptInPermission END)

(或者,为了避免在 MERGE 的两个分支中重复此逻辑,请在源代码中执行此操作:

USING (select Email,LocationName,convert( bit,
          CASE p2.OptInPermission
            WHEN 'Yes' THEN 1
            WHEN 'No' THEN 0
            ELSE p2.OptInPermission END as OptInPermission from @tblPanelMember) p2

)

关于sql-server - 如何在SQL Server 中自动将YES/NO 转换为BIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38496767/

相关文章:

sql - 增加大表中的列长度

SQL LEFT JOIN 和 GROUP BY

SQL Server 2000 - 跳出循环

.net - 带有 MySQL 的 Asp.net Web 应用程序

mysql - 从单一的多合一员工表中返回高于经理薪水的员工薪水

sql - 如何检查SQL数据库中是否存在函数?

SQL 服务器 2000 : Limit number of rows

sql - 启用/禁用/删除数据库行及其引用的最佳实践?

sql - MSSQL 使用 Functions 索引和性能

sql - 在函数中查询多个值并返回 1 个变量