2012-08-08 31 views
5

Tôi nhận thấy rằng khi tôi sử dụng báo cáo này, cột Action không nullable:Làm thế nào để kiểm soát nullability trong SELECT INTO cho cột đen dựa trên

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber 

Nhưng khi tôi sử dụng báo cáo này, cột Action là nullable:

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber 

lý do tôi tạo bảng theo cách này là bởi vì tôi không muốn các bảng tạm thời kế thừa collation của serialNumber từ collation máy chủ mặc định hoặc ở nơi khác. Tôi muốn nó khớp với collation của FSE_SerialNumber..SerialNumber.

Câu hỏi của tôi là, tôi có thể dựa vào chức năng truyền cho tôi một cột không có giá trị hoặc không được xác định rõ ràng và có thể thay đổi. Tại sao các diễn viên đột nhiên làm cho cột nullable? Có cách nào tốt hơn (bên cạnh ý kiến) để làm rõ rằng ý định của tôi là để có được một cột nullable ở đó?

+0

Tôi không biết rằng đây là tài liệu, nhưng ở nơi khác tôi cũng đã nhìn thấy các kỹ thuật của việc sử dụng một biến chứ không phải là một chữ để tạo ra một cột nullable.Tôi cho rằng đó là do biến (như biểu thức của bạn) có cấu trúc có siêu dữ liệu cho phép NULL, do đó, cột mới cũng vậy. Và nếu bạn đặt tên biến của mình là @NullableInt có thể xử lý vấn đề tự viết của bạn. – GilM

Trả lời

5

Dường như câu trả lời cuối cùng là here. Sao chép tại đây:

Siêu dữ liệu được xác định dựa trên cột nguồn và biểu thức được sử dụng trong danh sách SELECT. Dưới đây là các quy tắc:

  1. bất cứ biểu thức có sử dụng một built-in chức năng như SUBSTRING, LEFT, RIGHT vv (trừ ISNULL) ví dụ được coi là nullable bởi động cơ . Vì vậy, nếu bạn sử dụng CAST (somecol như char (8)) thì biểu thức là nullable

  2. Literals, hằng, biến toàn cầu như @@ ​​DBTS, @@ ERROR vv được coi là không nullable kể từ khi họ trở lại một số giá trị luôn

  3. Nếu expression là một cột sau đó nullability có nguồn gốc từ các siêu dữ liệu cột nguồn

    Vì vậy, để làm cho một biểu thức hoặc một cột trong danh sách SELECT không null thì sử dụng ISNULL quanh cột hay biểu thức.

Vì vậy, có vẻ như bạn an toàn khi sử dụng biểu thức CAST của mình.

0

Cá nhân, để kiểm soát tốt nhất, bạn nên tạo bảng của mình trước tiên. Ví dụ:

Create Table #MyTable (
    SerialNumber int Not Null, -- or however this is correctly defined. 
    Action int Null 
) 

Sau đó, thực hiện Insert Into ... Chọn Từ ...

Insert Into #MyTable(SerialNumber, Action) 
Select SerialNumber, 0 
From FSE_SerialNumber 

Sau đó, sẽ không có vấn đề gì các lĩnh vực nên.

Tôi biết điều này không hoàn toàn là những gì bạn đã hỏi, nhưng nó có thể là một cái gì đó để xem xét.

+0

Vấn đề với điều này là không có cách đơn giản để sao chép collation của cột SerialNumber vào bảng tạm thời sau đó. Tôi đã làm theo cách của bạn và phải thay đổi nó vì các vấn đề đối chiếu. – BlueMonkMN

+0

@BlueMonkMN. Tôi rất vui vì bạn đã tìm thấy một giải pháp phù hợp, và bạn thực sự đúng là bạn không thể _copy_ collation khi tạo một bảng, nhưng bạn _can_ cung cấp rõ ràng nó trong câu lệnh Create Table (để tham khảo trong tương lai). – Jim

0

gợi ý chung nhanh cho SELECT ... INTO: sử dụng ISNULL( với cột và cột này sẽ được tạo dưới dạng cột NOT NULL trong bảng.

Các vấn đề liên quan