2009-07-16 21 views
8

Tôi đang mắc kẹt trong một vấn đề khá lạ với SQL Server 2005, mà némSET trích dẫn IDENTIFIER nên được ON khi chèn một kỷ lục

"SET trích dẫn IDENTIFIER nên vào khi chèn bản ghi"

(sử dụng như SP) cho bảng cụ thể. Điều này làm việc tốt trước đó nhưng là ném lỗi này một cách ngẫu nhiên.

Tôi đã xác minh SP. Chúng tôi đã không chỉ định cài đặt SET QUOTED IDENTIFIER theo cách thủ công bên trong, vì vậy, nó phải được BẬT theo mặc định.

Ai đó có thể làm rõ điều gì có thể là vấn đề?

Bảng phải được tạo bằng SET QUOTED IDENTIFIER TRÊN phải không? Tôi chưa kiểm tra kịch bản bảng.

Tôi đã quan sát thấy vấn đề này chỉ xảy ra với SPs đang chèn hoặc cập nhật trên cột ngày (modifiedAt) ... Giá trị mẫu là '2009-08-10 06: 43: 59: 447' ..

Có vấn đề với các giá trị được chuyển không?

Trả lời

23

Sau một cuộc đấu tranh lâu dài, chúng tôi có thể khắc phục vấn đề này. Tôi chỉ muốn chia sẻ lý do.

Nhóm xây dựng của chúng tôi duy trì nội bộ công cụ nội bộ riêng biệt để triển khai tập lệnh, kích hoạt nội bộ tiện ích SQLCMD (shell) để thực thi các tập lệnh trong một db.

đây là thủ phạm ... bởi QUOTED_IDENTIFIER mặc định là tắt trong SQLCMD.

Mọi tập lệnh chạy qua công cụ này được tạo mà không có QUOTED IDENTIFIER. Chúng tôi là mô-đun duy nhất sử dụng chế độ xem được lập chỉ mục. Tất cả những câu chuyện còn bạn biết rõ trong bài viết trước đây của tôi :(

LƯU Ý:. Tôi sẽ bỏ phiếu bài của mọi người là hữu ích

+3

Bạn chỉ cần lưu tôi ít nhất một giờ săn bắn xung quanh --- tôi sẽ không có đoán rằng SQLCMD đã được thiết lập này đi. Cảm ơn bạn đã thêm làm rõ này –

+2

tuyệt vời ... tôi gặp khó khăn với vấn đề này cho nealry một tuần .. đó là một sai lầm đơn giản chết tiệt .. tôi nghĩ rằng điều này có thể hữu ích cho ai đó .. tôi rất vui vì nó đã giúp bạn ... :) – RameshVel

+1

Ditto về nhận xét của @Ralph Shillington. –

1

Trong SQL Server 2005, SET QUOTED IDENTIFIER được TẮT theo mặc định, không BẬT (trừ khi sử dụng kết nối ODBC hoặc OLE ... xem this để biết thêm thông tin).

Bạn không cần tạo bảng bằng SET QUOTED IDENTIFIER ON để sử dụng. Tất cả những gì bạn cần làm là thêm SET QUOTED IDENTIFIER ON vào đầu SP của bạn để kích hoạt nó để chạy thủ tục (và chắc chắn rằng nếu bạn không muốn để nó vào, bạn đã SET QUOTED IDENTIFIER OFF để bật lại).

EDIT

Tôi đứng sửa chữa. Theo điều này MSDN Page, SET QUOTED IDENTIFIER được BẬT theo mặc định (trừ khi kết nối với ứng dụng DB-Library.

+0

tôi đã giới thiệu trang này ... http://msdn.microsoft .com/vi-us/library/ms174393 (SQL.90) .aspx .. nó được viết bởi dafault .. – RameshVel

+0

thực sự chúng tôi dint thực thi SET QUOTED IDENTIFIER ON trong bất kỳ SP nào của ur. Tất cả các sps trong db creatd trong đó cách .. chỉ chèn sp cụ thể trên bảng cụ thể ném lỗi này ... chúng ta có thể dễ dàng giải quyết điều này nếu điều này xảy ra luôn ... nó được triển khai cách đây một tuần, nó hoạt động tốt cho đến hôm nay. vấn đề .. bất kỳ ý tưởng tại sao điều này hành xử như thi s ... – RameshVel

+0

Đảm bảo bạn không tự động xây dựng bất kỳ truy vấn SQL nào trong quy trình được lưu trữ. Điều đó có thể dẫn đến một số dữ liệu mà người dùng đã nhập với dấu ngoặc kép sẽ được tích hợp vào truy vấn.Khi SQL Server cố gắng thực hiện truy vấn ... bạn sẽ nhận được lỗi đó. –

1

Tôi vừa đọc bài này của Erland Sommarskog, The Curse and Blessings of Dynamic SQL và nó bao gồm đoạn sau liên quan đến SET QUOTED thiết lập IDENTIFIER:.

Giá trị mặc định cho thiết lập này phụ thuộc vào bối cảnh, nhưng các thiết lập ưa thích là ON, và nó phải được ON để sử dụng XQuery, lập chỉ mục quan điểm và lập chỉ mục trên các cột tính

Quy trình được lưu trữ của bạn có sử dụng XQuery, các chế độ xem hoặc chỉ mục được lập chỉ mục trên các cột được tính toán không?

+0

cảm ơn cho trả lời Amal, chúng tôi sử dụng bất kỳ XQuery ưa thích hoặc các tính năng khác .. nó chỉ là một đồng bằng chèn & cập nhật sp .. và nó không có bất kỳ chỉ số xem quá ... – RameshVel

5

Tập lệnh proc đã lưu trữ, đảm bảo/thay đổi tùy chọn SET, chạy ALTER PROC để đảm bảo SET QUOTED IDENTIFIER ON được thiết lập.

Tại sao?

Cài đặt "SET QUOTED IDENTIFIER" được xác định tại thời điểm tạo cho procs được lưu trữ và luôn là "BẬT" cho bảng. Source, BOL.

Khi một bảng được tạo ra, các trích dẫn tùy chọn IDENTIFIER luôn được lưu trữ như ON trong siêu dữ liệu của bảng ngay cả khi lựa chọn được thiết lập để OFF khi bảng là tạo.

Khi một thủ tục lưu trữ được tạo ra, SET QUOTED_IDENTIFIER và SET ANSI_NULLS thiết lập được chụp và sử dụng cho lời gọi tiếp theo của rằng thủ tục lưu trữ.

Mặc định cho kết nối có thể được xác định ở cấp máy chủ (tùy chọn người dùng sp_configure ') hoặc cấp cơ sở dữ liệu (ALTER DATABASE). Đối với SSMS, nó nằm trong "Tools..Options .. Query Execution..SQL Server..ANSI". Nó cũng là mặc định cho các thư viện máy khách (ngoại trừ DB-LIb).

Bây giờ, bạn mở Cửa sổ truy vấn SSMS và bắt đầu nhập "CREATE PROC ..", sau đó nó sử dụng cài đặt SSMS khi bạn chạy mã.

VÀ SET IDOTIFIER SET không thể được đặt tại thời gian chạy bên trong proc được lưu trữ. Cho tôi xem một tài liệu tham khảo trước khi bạn không đồng ý ... Từ liên kết MS BOL trên:

Khi thực hiện bên trong một lưu trữ thủ tục, các thiết lập của SET QUOTED_IDENTIFIER là không thay đổi.

Bạn phải làm việc chăm chỉ để chạy bất kỳ mã nào với OFF này ... vì vậy, sửa chữa có khả năng nhất là ALTER hoặc tạo lại proc được lưu trữ.

+0

hi gbn tôi đã đính kèm dữ liệu mẫu , u có thể nhìn vào đó ..... – RameshVel

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